2017-04-27 11 views
1

J'ai un problème très étrange que je n'arrive pas à voir la cause de.Incohérence dans les extensions de catégorie iOS 10+

J'ai une extension de catégorie sur NSDictionary qui a une méthode appelée titre. La méthode fonctionne comme suit:

- (NSString*)title { 
    return self[@"title"]; 
} 

Ce que cela me permet de faire, est d'avoir une méthode de conveniece sur un NSDictionary pour retourner un titre.

Voici un exemple d'utilisation:

NSDictionary *config = [mConfigManager currentConfig]; 

if ([config title]) { 

    return [config title]; 
} 
return @""; 

Maintenant, c'est où les choses deviennent étranges. Sur iOS 10, la méthode de titre renvoie parfois. Dans les cas où cela renvoie zéro, un appel manuel à config[@"title"] renvoie la valeur. En conséquence, j'ai ajusté mon code comme suit:

NSDictionary *config = [mConfigManager currentConfig]; 

if ([config title]) { 

    return [config title]; 
} 
else if(config[@"title"]) 
{ 
    return config[@"title"]; 
} 
return @""; 

Avec le code ci-dessus, elle retourne toujours le titre (si elle existe). Cependant, il fonctionne parfois uniquement pour le cas else if et non pour la version de la catégorie.

La question est:

Pourquoi la catégorie ne retourne une valeur quand il est en train de faire exactement la même chose que l'appel manuel?

Ce qui rend ce encore plus étrange est qu'il est ne fonctionne quelque temps: Voir la sortie du journal suivant:

premier clic

(lldb) po [config title] 
Joe Bloggs 

second clic

(lldb) po [config title] 
nil 
(lldb) po config[@"title"] 
Joe Bloggs 

Remarque : Les journaux ci-dessus ont tous deux couru d uring la même instance de l'application, déclenchée par la sélection d'une cellule de vue de table. Cela élimine donc les cas où une désallocation ou une réaffectation pourrait avoir lieu.

Une chose que j'ai remarqué cependant, est que la console ne sera pas sortir le contenu de config et retourne à la place l'erreur suivante:

<object returned empty description> 

La vue cependant variable montre pleinement l'objet et toutes les variables. L'objet est défini comme NSDictionaryM dans la liste des variables.

Toute aide avec ceci serait massivement appréciée.

Merci à l'avance

+1

Renommer votre méthode avec préfixe et voir si vous pouvez reproduire cela. De plus, que se passe-t-il dans '[mConfigManager currentConfig]'? –

+0

La ligne ne se casse pas au moment où elle renvoie 'nil', ce qui donne l'impression qu'elle n'est pas appelée. '[mConfigManager currentConfig]' retourne juste un objet NSDictionary. –

Répondre

1

quelque chose de très probablement ailleurs dans le système, peut-être (probablement) d'Apple, a également créé une méthode title sur NSDictionary dans une catégorie. Quand il y a deux méthodes avec le même nom défini dans les catégories, il est indéfini lequel sera exécuté. (J'ai personnellement rencontré cela quand Apple a ajouté pop à NSMutableArray dans une catégorie privée, et mon programme a détraqué de façon imprévisible.

Vous devez préfixer vos méthodes de catégorie (c'est-à-dire mc_title ou autre). Apple devrait préfixer leurs méthodes privées, mais ils ne le font pas, vous devez donc.

(Bien sûr, vouloir ajouter cette méthode pour NSDictionary suggère fortement que vous devriez vraiment créer une petite classe de données au lieu d'utiliser un dictionnaire pour cela, mais c'est une question totalement distincte.)

+0

Je vais essayer et voir si c'est le problème –

+0

En ce qui concerne la conception des objets, le code a été écrit à l'origine par quelqu'un d'autre, j'ai été amené pour des corrections de bugs. Personnellement, je serais allé en bas de la route aussi :) –