UISwitch setThumbTintColor provoquant un crash (iOS 6 uniquement)?

MISE À JOUR: Apple a reçu un mail disant que le bug / problème a été corrigé maintenant et que la prochaine version du SDK n'aura pas ce problème. Paix!

J'ai ceci dans le code pour mon 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]]; } 

Ce que j'appelle ensuite depuis l'application - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions

J'utilise aussi ARC. Dans iOS 6, mon application ne cesse de se bloquer. J'ai activé NSZombie et il continue à dire: *** -[UIDeviceRGBColor release]: message sent to deallocated instance 0x9658eb0

Et maintenant j'ai réalisé un stream parfaitement reproductible pour ce qui précède. Lorsque je commente la ligne setThumbTintColor seule dans customizeAppearance, tout fonctionne correctement comme il se doit. Lorsque j'utilise la ligne setThumbTintColor à la place, l'application se bloque exactement de la même manière à chaque fois.

Est-ce un problème connu avec UISwitch / setThumbTintColor / UIColor? Quoi d'autre pourrait être la cause sinon la couleur du commutateur?

Je faisais aussi ce tutoriel et j'ai eu le même problème. (Vous ne savez pas pourquoi vous ne rencontrez pas cela, car mon code tapé à la main et le code de la solution ont le même problème pour moi?)

Le premier segue se passerait bien, mais après le return, la prochaine section échouerait.

Après avoir défini un point d'arrêt d'exception global, j'ai pu voir thumbColorTint dans la stack d'appels lorsque l'exception a été générée. J'ai fait une supposition que l'object était sorti trop tôt. Pour corriger j'ai créé une propriété dans mon délégué d'application .. (vous n'avez pas besoin de le faire dans le délégué de l'application juste l'object que vous définissez l'apparence UISwitch, qui dans mon cas était l'appdelegate)

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

Ensuite, je l'ai mis en place comme si

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

Et maintenant tout fonctionne comme prévu puisque l'object n'est pas libéré au début. C'est probablement un défaut et l'object est libéré même s'il est encore nécessaire. UISwitch semble avoir un défaut pour l'API 🙁

J'ai aussi rencontré ce bug avec la sortie d'UISwitch d'Apple. J'ai une solution similaire, mais je pense que c'est juste un peu plus agréable car elle ne nécessite pas l'ajout d'une propriété étrangère:

 UIColor *thumbTintColor = [[UIColor alloc] initWithRed:red green:green blue:blue alpha:alpha]]; //we're calling retain even though we're in ARC, // but the comstackr doesn't know that [thumbTintColor performSelector:NSSelectorFromSsortingng(@"retain")]; //generates warning, but OK [[UISwitch appearance] setThumbTintColor:[self thumbTintColor]]; 

En revanche, cela crée un avertissement de compilateur, mais alors – il y a vraiment un bug ici, mais pas le nôtre!

Pour l'instant, je vais avec cette réponse par Bill:

 // 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