3 回答

TA貢獻1895條經驗 獲得超3個贊
屬性只是用于的setter和getter,ivars并且(幾乎)應該始終使用它們,而不是直接訪問。
@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 在這種情況下,會創建這兩種方法(并非100%準確):
- (NSString *)name {
return [[_name copy] autorelease];
}
- (void)setName:(NSString *)value {
[value retain];
[_name release];
_name = value;
}
現在很容易區分ivars和獲取器/設置器。訪問器已獲得self.前綴。無論如何,您都不應該直接訪問變量。
您的示例代碼無效,因為它應該是:
_myVar = some_other_object; // _myVar is the ivar, not myVar.
self.myVar = some_other_object; // works too, uses the accessors

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