runtime - iOS 中 分类关联实例属性的写法有点疑问?
PHP中文网
PHP中文网 2017-04-18 09:52:09
0
3
684
- (NSString *)associatedObject_copy {
    return objc_getAssociatedObject(self, _cmd);
}

- (void)setAssociatedObject_copy:(NSString *)associatedObject_copy {
    objc_setAssociatedObject(self, @selector(associatedObject_copy), associatedObject_copy, OBJC_ASSOCIATION_COPY_NONATOMIC);
}

上面这段代码中, _cmdself 类似,只不过前者表示的是当前的SEL
第二个方法的第二个参数为什么不也用_cmd呢?我理解的 _cmd@selector(当前方法)不是一个意思吗?
为什么第一个方法的第二个参数用_cmd,第二个方法的第二个参数却用@selector(xxx)了啊?
希望能告知一二.....

啰嗦这么多:

其实我的问题主要是 在同一个方法里面,_cmd@selector(当前方法) 完全一样嘛?不一样,有什么区别?

PHP中文网
PHP中文网

认证高级PHP讲师

répondre à tous(3)
Peter_Zhu

Parce que le même key doit être utilisé pour lier le même setter et getter d'attribut, mais l'utilisation de _cmd ne peut obtenir que le nom de la méthode actuelle, vous devez donc ou obtenir le même key que ci-dessus dans la méthode set 🎜>, _cmd est également un paramètre de type SEL et est identique à @selector(xxx)

.
左手右手慢动作

Le deuxième paramètre de objc_getAssociatedObject et objc_setAssociatedObject n'est qu'une clé

id objc_getAssociatedObject(id object, const void *key);

Bien sûr, vous pouvez utiliser @selector() comme paramètre. Son essence est également un identifiant constant. Vous avez également dit ci-dessus que votre _cmd est également un SEL. Logiquement, le deuxième paramètre de votre objc_setAssociatedObject devrait être. _cmd C'est vrai, l'usage général est défini comme suit :


static const void *YourKeyName  = &YourKeyName;
阿神

_cmd ne peut obtenir que le nom de la méthode actuelle. Si vous utilisez également _cmd dans set, vous obtiendrez "setAssociatedObject_copy".

Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal