Tencent / QMUI_iOS

QMUI iOS——致力于提高项目 UI 开发效率的解决方案
http://qmuiteam.com/ios
Other
7.05k stars 1.37k forks source link

将 UIView.backgroundColor 设置为 QMUIThemeColor 后再设置为另一个与 QMUIThemeColor 当前色值相同的颜色时,后者无效 #1463

Closed MoLice closed 1 year ago

MoLice commented 1 year ago

如何重现

UIView *view = UIView.new;
view.backgroundColor = [UIColor qmui_colorWithThemeProvider:^UIColor * _Nonnull(__kindof QMUIThemeManager * _Nonnull manager, __kindof NSObject<NSCopying> * _Nullable identifier, __kindof NSObject * _Nullable theme) {
    if ([identifier isEqual:QDThemeIdentifierDark]) {
        return UIColorRed; // ①
    }
    return UIColorGreen; // ②
}];
view.backgroundColor = UIColorGreen; // ③

以上代码预期在 Light/Dark 切换时 view.backgroundColor 固定显示③的绿色,但实际运行后会发现切换 Light/Dark 时,view.backgroundColor 在①②里变化,③无效了。

关键在于②③必须是相同的颜色。

其他信息

MoLice commented 1 year ago

已修复该问题,请根据 iOS 版本支持情况选择升级到 4.6.0(iOS 11-16)4.6.1(iOS 13-16)

sugerGDev commented 10 months ago

@MoLice 版本4.6.0中, 代码如下: CGColorRef cgColor = CGColorCreate(CGColorSpaceCreateDeviceRGB(), (CGFloat[]){rawColor.qmui_red, rawColor.qmui_green, rawColor.qmui_blue, rawColor.qmui_alpha});

用 CGColorCreate创建出来的颜色空间放到QMUICGColorOriginalColorBindKey中,但是会造成到处内存leak哇,因为 CGColorCreate要对应CGColorRelease 啊,这遵守MRC的。我从leak 跟踪到,如果没有用这个功能估计要屏蔽掉或者其他方式,希望大佬修复~,不然会造成库到处Leak不稳定问题~。

有两处地方 UIColor+QMUITheme 和 UIColor+QMUI

MoLice commented 10 months ago

@sugerGDev 2022-12 已修复该泄露。

sugerGDev commented 10 months ago

@MoLice 哦哦哦,我看到最新版本修复了。应用版本限制,没升级到最新。用leak在QMUI找了一会儿发现了,收获很多,哈哈哈