第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

屬性與實(shí)例變量

屬性與實(shí)例變量

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

3 回答

?
蠱毒傳說(shuō)

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


查看完整回答
反對(duì) 回復(fù) 2019-11-12
?
哈士奇WWW

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í)間之后,很明顯。


查看完整回答
反對(duì) 回復(fù) 2019-11-12
  • 3 回答
  • 0 關(guān)注
  • 558 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)