我在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
现在我已经实现了上述完全可重复的流程。当我在customizeAppearance中单独注释掉setThumbTintColor行时,一切正常。当我使用setThumbTintColor代替时,应用程序每次都会以完全相同的方式崩溃。
这是UISwitch / setThumbTintColor / UIColor的任何人都知道的问题吗?如果不是开关颜色,还有什么原因?
答案 0 :(得分:19)
我也在做this教程并遇到同样的问题。 (不确定为什么你没有遇到这种情况,因为我输入的代码和解决方案代码对我来说都有同样的问题?)
第一个segue会发生,但是在返回后,下一个segue会失败。
设置全局异常断点后,我可以在生成异常时在调用堆栈中看到thumbColorTint。我猜测对象太早发布了。为了解决这个问题,我在我的app委托中创建了一个属性..(你不需要在app中委托你设置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的缺陷:(
答案 1 :(得分:3)
我也遇到了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]];
在缺点方面,它确实会创建一个编译器警告,但是 - 这里确实存在一个错误,而不是我们的错误!
答案 2 :(得分:1)
现在,按照比尔的回答我会按照这个说法去做:
// 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