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 ?
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
属性:直接赋值是:
_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
rrreee 🎜L'affectation directe est :name
suivant :_name = @"Jack";
, passerself.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 à utiliserNSString *str = _name
lors de la lecture des données et à utiliserself.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 deself.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. 🎜