Maison > Questions et réponses > le corps du texte
Objectif efficace -c2.0 Ce livre dit que dans la méthode d'initialisation et la méthode de dealloc, vous devez toujours lire et écrire des données via des variables d'instance. Après l'avoir lu pendant longtemps, je n'ai pas compris la raison ? Quelqu'un a-t-il lu ce livre ?
黄舟2017-05-17 10:07:31
N'est-ce pas très clair dans le livre :
_name = @"Jack"
Attribue des valeurs aux variables directement sans envoyer de messages via le setter, ce qui est rapide. _name = @"Jack"
不经过setter的消息发送,直接为变量赋值,速度快。
对于以下的 name
属性:
@property (nonatomic, copy) NSString *name;
直接赋值是: _name = @"Jack";
,通过 self.name = @"Jack"
其实等同于 _name = @"Jack".copy
;
self.name = @"Jack"
会触发KVO,_name = @"Jack"
不会
self.name = @"Jack"
可以在 setter 方法中进行断点调试,每次赋值你都知道。
所以有一种合理折中方案就是,读取数据的时候用 NSString *str = _name
,赋值用 self.name = @"Jack"
。
另外需要注意的是子类可能复写setter方法,用 self.name = @"Jack"
可能不等同于 _name = @"Jack".copy
Pour l'attribut name
suivant :
_name = @"Jack";
, passer self.name = @"Jack"
est en fait équivalent à _name = @"Jack". copier
;🎜
🎜
🎜🎜self.name = @"Jack"
déclenchera KVO, _name = @"Jack"
ne le fera pas🎜
🎜🎜self.name = @"Jack"
Vous pouvez effectuer le débogage du point d'arrêt dans la méthode setter, et vous saurez chaque fois qu'une valeur lui est attribuée. 🎜
🎜Un compromis raisonnable consiste donc à utiliser NSString *str = _name
lors de la lecture des données et à utiliser self.name = @"Jack"
lors de l'attribution de valeurs. 🎜
🎜Une autre chose à noter est que les sous-classes peuvent remplacer les méthodes de définition, et l'utilisation de self.name = @"Jack"
peut ne pas être équivalente à _name = @"Jack".copy
. 🎜
🎜Je ne comprends pas ce sur quoi vous n'êtes pas clair, je ne peux donc que le décrire brièvement en utilisant mes idées. 🎜