亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

屬性與實例變量

屬性與實例變量

Cats萌萌 2019-11-12 11:21:14
我正在嘗試了解某些人如何使用策略來區分實例變量與屬性。常見的模式如下:@interface MyClass : NSObject {    NSString *_myVar;}@property (nonatomic, retain) NSString *myVar;@end@implementation MyClass@synthesize myVar = _myVar;現在,我認為此策略背后的整個前提是使人們可以輕松區分ivar和屬性之間的區別。因此,如果我想使用由綜合屬性繼承的內存管理,則可以使用以下方法:myVar = @"Foo";另一種方法是通過self。[ivar / property here]引用它。使用@synthesize myVar = _myVar策略的問題是我發現編寫如下代碼:myVar = some_other_object; // doesn't work. 編譯器抱怨未聲明myVar。為什么會這樣?謝謝。
查看完整描述

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


查看完整回答
反對 回復 2019-11-12
?
哈士奇WWW

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一段時間之后,很明顯。


查看完整回答
反對 回復 2019-11-12
  • 3 回答
  • 0 關注
  • 550 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號