【问题标题】:UISwitch setThumbTintColor causing crash (iOS 6 only)?UISwitch setThumbTintColor 导致崩溃(仅限 iOS 6)?
【发布时间】:2023-10-16 16:26:02
【问题描述】:

更新:收到来自 Apple 的邮件,说该错误/问题现已修复,下一个 SDK 版本不会出现此问题。和平!

我的 AppDelegate 的代码中有这个:

- (void) customizeAppearance {
    [[UISwitch appearance] setOnTintColor:[UIColor colorWithRed:0 green:175.0/255.0 blue:176.0/255.0 alpha:1.0]];
    [[UISwitch appearance] setTintColor:[UIColor colorWithRed:255.0f/255.0f green:255.0f/255.0f blue:255.0f/255.0f alpha:1.000f]];
    [[UISwitch appearance] setThumbTintColor:[UIColor colorWithRed:0.9 green:0.9 blue:0.9 alpha:1.0]];
 }

然后我从- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 打来电话

我也使用 ARC。在 iOS 6 中,我的应用程序不断崩溃。我启用了 NSZombie,它一直说:*** -[UIDeviceRGBColor release]: message sent to deallocated instance 0x9658eb0

现在我已经实现了上述的一个完全可重现的流程。当我在customAppearance 中单独注释掉setThumbTintColor 行时,一切正常。当我改用 setThumbTintColor 行时,应用程序每次都以完全相同的方式崩溃。

对于任何使用 UISwitch/setThumbTintColor/UIColor 的人来说,这是一个已知问题吗?如果不是开关颜色,还有什么原因?

【问题讨论】:

  • 我不知道为什么会这样,但是如果你可以在一个基本的示例应用程序中重现它,你可能想在bugreport.apple.com发布一个错误
  • raywenderlich.com/21703/user-interface-customization-in-ios-6。不会在他的示例应用程序中崩溃。我认为这是另一回事。我在我的应用程序中搞砸了什么,我不知道。
  • 什么时候崩溃?从您的帖子中调用此行?如果你在-application:didFinishLaunchingWithOptions: 中调用它,应该很容易找到,因为目前还没有执行太多。如果它在其他地方崩溃,看看周围的一些代码可能会很有趣。
  • 此处发布的代码运行良好。问题一定出在其他地方。您是否尝试设置异常断点
  • 这仍然存在。备案雷达上还没有任何活动。

标签: iphone ios uicolor uiswitch uiappearance


【解决方案1】:

我也在做this 教程并且遇到了同样的问题。 (不知道为什么你没有遇到这种情况,因为我的手写代码和解决方案代码对我来说都有同样的问题?)

第一个 segue 会发生,但返回后下一个 segue 会失败。

设置全局异常断点后,我可以在生成异常时在调用堆栈中看到 thumbColorTint。我猜测该对象被释放得太早了。为了解决这个问题,我在我的应用委托中创建了一个属性..(您不需要在应用委托中执行此操作,只需设置您正在设置 UISwitch 外观的对象,在我的情况下是 appdelegate)

@interface SurfsUpAppDelegate()
@property (strong, nonatomic) UIColor *thumbTintColor;
@end

然后我就这样设置了

[self setThumbTintColor:[UIColor colorWithRed:0.211 green:0.550 blue:1.000 alpha:1.000]];
[[UISwitch appearance] setThumbTintColor:[self thumbTintColor]];

现在一切都按预期进行,因为该对象没有提前释放。这可能是一个缺陷,即使仍然需要该对象,它也会被释放。 UISwitch 的 API 似乎有缺陷 :(

【讨论】:

  • 这解决了这个问题。因此接受。我还找到了另一种解决方法。将 switch 的父视图设置为 strong 也可以防止崩溃。无论如何,我继续使用示例项目提交了一个错误,因为除了开关之外的任何其他 UI 元素似乎都不会发生这种情况,而且只有在设置 thumbTintColor 属性时才会发生这种情况。
  • 我也有同样的问题。比尔和伯恩的解决方案都对我有用。但是,我有另一个包含导航控制器的项目。堆栈中有 5 个视图控制器,有时可以推送/弹出视图。当任一场景包含开关时。上述解决方案均无效。我想我们只是等待苹果解决这个问题。
  • 这种解决方法似乎对我没有任何影响。无论我如何设置 thumbTintColor,当 switch 实例被解除分配时,我的应用程序都会崩溃。
  • 抱歉,它并非在所有情况下都有效。我怀疑在某些情况下它会正确发布,而其他情况下则不会(正如韦恩所指出的那样)。错误修复将一劳永逸地解决它。 NONT 提出了一个很好的建议,但是当它被修复时这可能会失败。此类内存问题很难修复。
【解决方案2】:

Apple 的 UISwitch 过度释放时,我也遇到了这个错误。我有一个类似的解决方案,但我认为它更好一点,因为它不需要添加无关的属性:

UIColor *thumbTintColor =  [[UIColor alloc] initWithRed:red green:green blue:blue alpha:alpha]];

//we're calling retain even though we're in ARC,
// but the compiler doesn't know that

[thumbTintColor performSelector:NSSelectorFromString(@"retain")]; //generates warning, but OK
[[UISwitch appearance] setThumbTintColor:[self thumbTintColor]];

不利的一面是,它确实会产生编译器警告,但是 - 这里确实有一个错误,只是不是我们的!

【讨论】:

    【解决方案3】:

    现在,按照比尔的回答,我会这样做:

    // SomeClass.m
    
    @interface SomeClass ()
    
    // ...
    
    @property (weak,   nonatomic) IBOutlet UISwitch *thumbControl;
    @property (strong, nonatomic)           UIColor *thumbControlThumbTintColor;
    
    // ...
    
    @end
    
    @implementation SomeClass
    
    // ...
    
    - (void)viewDidLoad
    {
        // ...
    
        self.thumbControl.thumbTintColor = self.thumbControlThumbTintColor = [UIColor colorWithRed:0.2 green:0.0 blue:0.0 alpha:1.0];
    
        // ...
    }
    
    // ...
    
    @end
    

    【讨论】: