3 回答

TA貢獻(xiàn)1895條經(jīng)驗(yàn) 獲得超3個(gè)贊
屬性只是用于的setter和getter,ivars并且(幾乎)應(yīng)該始終使用它們,而不是直接訪問(wèn)。
@interface APerson : NSObject {
// NSString *_name; // necessary for legacy runtime
}
@property(readwrite) NSString *name;
@end
@implementation APerson
@synthesize name; // use name = _name for legacy runtime
@end
@synthesize 在這種情況下,會(huì)創(chuàng)建這兩種方法(并非100%準(zhǔn)確):
- (NSString *)name {
return [[_name copy] autorelease];
}
- (void)setName:(NSString *)value {
[value retain];
[_name release];
_name = value;
}
現(xiàn)在很容易區(qū)分ivars和獲取器/設(shè)置器。訪問(wèn)器已獲得self.前綴。無(wú)論如何,您都不應(yīng)該直接訪問(wèn)變量。
您的示例代碼無(wú)效,因?yàn)樗鼞?yīng)該是:
_myVar = some_other_object; // _myVar is the ivar, not myVar.
self.myVar = some_other_object; // works too, uses the accessors

TA貢獻(xiàn)1799條經(jīng)驗(yàn) 獲得超6個(gè)贊
通常,我將屬性的名稱與實(shí)例變量的名稱相同。這是@property語(yǔ)法的默認(rèn)假設(shè)。如果發(fā)現(xiàn)自己正在使用默認(rèn)值,那說(shuō)明您做錯(cuò)了(或您的框架sux,我認(rèn)為Cocoa / Cocoa-touch并非如此)。
您遇到的編譯器錯(cuò)誤是因?yàn)槭褂脤傩允冀K必須有一個(gè)對(duì)象引用,即使在您自己的類實(shí)現(xiàn)中也是如此:
self.stuff = @"foo"; // property setter
[stuff release]; // instance variable
stuff = @"bar"; // instance variable
return self.stuff; // property getter
我知道許多可可程序員不同意這一點(diǎn),但是我認(rèn)為在類實(shí)現(xiàn)中使用屬性是一種不好的做法。我寧愿看到這樣的事情:
-(void) someActionWithStuff: (NSString*) theStuff {
// do something
[stuff release];
stuff = [theStuff copy];
// do something else
}
比這個(gè):
-(void) someActionWithStuff: (NSString*) theStuff {
// do something
self.stuff = theStuff;
// do something else
}
我更喜歡盡可能明確地進(jìn)行內(nèi)存管理。但是,即使您不同意,使用該self.stuff表單也可以在任何經(jīng)驗(yàn)豐富的Objective-C程序員中暗示您正在調(diào)用屬性而不是訪問(wèn)實(shí)例變量。對(duì)于初學(xué)者來(lái)說(shuō),這是一個(gè)很容易理解的精妙之處,但是在使用Objective-C 2.0一段時(shí)間之后,很明顯。
- 3 回答
- 0 關(guān)注
- 558 瀏覽
添加回答
舉報(bào)