2014-07-15 2 views
0

je me suis soudain avoir une catégorie pour le NSURLConnection et j'utiliser des objets associés pour étendre la classe de conserver une référence à une classe personnalisée de mes afin que je puisse obtenir plus tard dans un autre contexte quand délégué et transmettre l'appel à la cible réelle plus tard. De cette façon, je peux modifier les données souhaitées dans certains points d'exécution.objc_getAssociatedObject commence à renvoyer nul

Mais pour une raison quand tout fonctionnait normalement, objc_getAssociatedObject retourne nil, ce qui signifie que je ne récupère pas mon objet associé et que tout le processus s'arrête.

Mon code:

static void* KEY_CONNECTION_MYCLASS; 

static MyClass* GetConnectionMyClass(NSURLConnection* connection) 
{ 
    return (MyClass*) 
    objc_getAssociatedObject(connection, KEY_CONNECTION_MYCLASS); 
} 

static void AttachConnectionMyClass(NSURLConnection* connection, MyClass* myClass) 
{ 
    objc_setAssociatedObject(connection, 
         &KEY_CONNECTION_MYCLASS, 
         myClass, 
         OBJC_ASSOCIATION_RETAIN_NONATOMIC); 
} 

Et comment j'accéder aux fonctions ci-dessus des autres fonctions statiques.

Quand je tournerai l'objet associé:

NSURLConnection* connection = (NSURLConnection*) self; 
AttachConnectionMyClass(connection, myClass); 

Obtenez l'objet associé:

NSURLConnection* connection = (NSURLConnection*)self; 
MyClass* myClass = GetConnectionMyClass(connection); 
if (myClass) 
{ 
    NSLog(@"MyClass is NOT NIL"); 
} 
else 
{ 
    NSLog(@"MyClass is NIL"); 
} 

Le résultat est toujours "MyClass est NUL". Comme je l'ai mentionné, cela fonctionnait correctement et s'est arrêté sans aucune raison qui me vient à l'esprit.

Qu'en pensez-vous?

Répondre

2

Vous utilisez des clés différentes lors de la configuration et obtenir l'objet.

Notez que le & lors de la configuration, mais pas lors de l'obtention. Vous devriez utiliser dans les deux cas.

Une bonne pratique est de définir la clé comme ceci:

static void* KEY_CONNECTION_MYCLASS = &KEY_CONNECTION_MYCLASS; 

De cette façon, votre faute de frappe n'aurait rien changé. Mais c'est bon de réparer les fautes de frappe.

+0

Bon sang! Je n'ai même pas remarqué, ça a dû arriver quand j'ai refaçonné quelque chose. Merci pour la réponse rapide. –