強(qiáng)烈建議:讀取實(shí)例變量時(shí)直接訪問鼻由;設(shè)置實(shí)例變量時(shí)通過屬性暇榴。
示例代碼:
@interface EOCPerson : NSObject
@property (nonatomic, copy) NSString *firstName;
@property (nonatomic, copy) NSString *lastName;
// Convenience for firstName + " " + lastName:
- (NSString*)fullName;
- (void)setFullName:(NSString*)fullName;
@end
方法實(shí)現(xiàn)(點(diǎn)語(yǔ)法形式):
- (NSString*)fullName {
return [NSString stringWithFormat:@"%@ %@", self.firstName, self.lastName];
}
- (void)setFullName:(NSString *)fullName {
NSArray *components = [fullName componentsSeparatedByString:@" "];
self.firstName = [components objectAtIndex:0];
self.lastName = [components objectAtIndex:1];
}
直接訪問實(shí)例變量形式:
- (NSString*)fullName {
return [NSString stringWithFormat:@"%@ %@", _firstName, _lastName];
}
- (void)setFullName:(NSString *)fullName {
NSArray *components = [fullName componentsSeparatedByString:@" "];
_firstName = [components objectAtIndex:0];
_lastName = [components objectAtIndex:1];
}
區(qū)別:
- 直接訪問實(shí)例變量的特點(diǎn):不經(jīng)過 OC 的“方法派送”(method dispatch),速度更快蕉世;不會(huì)調(diào)用
setter
方法蔼紧,繞過了“內(nèi)存管理語(yǔ)義”;不會(huì)觸發(fā)“鍵值觀測(cè)”(Key-Value Observing, KVO)通知狠轻。 - 屬性訪問優(yōu)點(diǎn):可以給
getter
和/或setter
方法新增斷點(diǎn)奸例,便于查錯(cuò)。
一種合理的折中方案:寫入實(shí)例變量時(shí)向楼,通過“設(shè)置方法”查吊;讀取實(shí)例變量時(shí),直接訪問湖蜕。
原因:既能提高讀取操作的速度逻卖,又能控制對(duì)屬性的寫入操作。
惰性(延遲)實(shí)例化示例代碼:
- (EOCBrain*)brain {
if (!_brain) {
_brain = [Brain new];
}
return _brain;
}
一些名詞:
“鍵值觀測(cè)”(Key-Value Observing, KVO)通知:一種通知機(jī)制昭抒,當(dāng)某對(duì)象屬性改變時(shí)评也,可通知其他對(duì)象炼杖。
主要來(lái)源:《Effective Objective-C 2.0》