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

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

為什么在IOS中用前導(dǎo)下劃線重命名合成屬性?

為什么在IOS中用前導(dǎo)下劃線重命名合成屬性?

iOS
翻閱古今 2019-07-27 15:15:20
為什么在IOS中用前導(dǎo)下劃線重命名合成屬性?在Xcode 4中創(chuàng)建新項(xiàng)目時(shí),樣板代碼在合成實(shí)現(xiàn)文件中的IVAR時(shí)添加一個(gè)下劃線字符,如下所示:@synthesize window = _window;或:@synthesize managedObjectContext = __managedObjectContext;有人能告訴我這里取得了什么成就嗎?我不是一個(gè)完全的裸體,但這是目標(biāo)的一個(gè)方面-C我不明白。另一個(gè)困惑之處是:在應(yīng)用程序委托實(shí)現(xiàn)中,在如前所述合成窗口Ivar之后,在應(yīng)用程序dfinishLaunchingWithOptions:Method中,使用Self引用了窗口和viewController Ivars:self.window.rootViewController = self.viewController[self.window makeKeyAndVisible];但是在dealloc方法中它是_Window或_viewController謝謝
查看完整描述

3 回答

?
蝴蝶不菲

TA貢獻(xiàn)1810條經(jīng)驗(yàn) 獲得超4個(gè)贊

這是Object-C運(yùn)行時(shí)以前版本的工件。

最初,@synthesize用于創(chuàng)建訪問器方法,但運(yùn)行庫仍然要求實(shí)例變量必須顯式實(shí)例化:

@interface Foo : Bar {
  Baz *_qux;}@property (retain) Baz *qux;@end@implementation Foo@synthesize qux = _qux;- (void)dealloc {
  [_qux release];
  [super dealloc];}@end

人們會(huì)在實(shí)例變量前加上前綴,以區(qū)分它們與屬性(盡管Apple不希望您使用下劃線,但這是另一回事)。將該屬性合成為指向?qū)嵗兞康膶傩?。但重點(diǎn)是_qux是一個(gè)實(shí)例變量,并且self.qux(或[self qux])是消息qux發(fā)送到對(duì)象self.

中直接使用實(shí)例變量。-dealloc相反,使用訪問器方法應(yīng)該是這樣的(盡管我不推薦它,原因我稍后會(huì)解釋):

- (void)dealloc {
  self.qux = nil; // [self setQux:nil];
  [super dealloc];}

這有釋放的效果qux,并將引用歸零。但這可能會(huì)帶來不幸的副作用:

  • 您可能最終會(huì)觸發(fā)一些意外的通知。其他對(duì)象可能正在觀察對(duì)

    qux

    ,在使用訪問器方法更改訪問器方法時(shí)記錄。
  • (并不是每個(gè)人都同意這一點(diǎn):)像訪問器那樣將指針歸零可能會(huì)隱藏程序中的邏輯錯(cuò)誤。如果您曾經(jīng)訪問對(duì)象的實(shí)例變量

    對(duì)象已被解除分配,您正在做一些嚴(yán)重錯(cuò)誤的事情。因?yàn)槟繕?biāo)-C

    nil

    -消息傳遞語義,但是,您永遠(yuǎn)不會(huì)知道,已經(jīng)使用訪問器設(shè)置為

    nil

    ..如果直接釋放實(shí)例變量,而不是將引用歸零,那么訪問已釋放的對(duì)象就會(huì)引起響亮的聲音。

    EXC_BAD_ACCESS.

運(yùn)行時(shí)的后期版本除了訪問器方法之外,還增加了合成實(shí)例變量的能力。使用這些版本的運(yùn)行時(shí),可以編寫上面的代碼,省略實(shí)例變量:

@interface Foo : Bar@property (retain) Baz *qux;@end@implementation Foo@synthesize qux = _qux;- (void)dealloc {
  [_qux release];
  [super dealloc];}@end

實(shí)際上,這會(huì)將實(shí)例變量合成到Foo_qux,它由getter和setter消息訪問。-qux-setQux:.

我建議不要這樣做:這有點(diǎn)麻煩,但是使用下劃線有一個(gè)很好的理由,那就是,防止意外地直接訪問Ivar。如果您認(rèn)為可以相信自己會(huì)記住是使用原始實(shí)例變量還是使用訪問器方法,那么只需這樣做:

@interface Foo : Bar@property (retain) Baz *qux;@end@implementation Foo@synthesize qux;- (void)dealloc {
  [qux release];
  [super dealloc];}@end

然后,當(dāng)您想直接訪問實(shí)例變量時(shí),只需說qux(翻譯成self->qux在C語法中,用于從指針訪問成員)。當(dāng)您想要使用訪問器方法(這將通知觀察者,并做其他有趣的事情,并使事情更安全和更容易與內(nèi)存管理),使用self.qux ([self qux])和self.qux = blah; ([self setQux:blah]).

可悲的是,蘋果的示例代碼和模板代碼糟糕透了。永遠(yuǎn)不要用它作為正確的目標(biāo)-C風(fēng)格的指南,當(dāng)然也不要用它作為正確的軟件體系結(jié)構(gòu)的指南。*)






查看完整回答
反對(duì) 回復(fù) 2019-07-28
?
慕無忌1623718

TA貢獻(xiàn)1744條經(jīng)驗(yàn) 獲得超4個(gè)贊

這是另一個(gè)原因。在不突出實(shí)例變量的情況下,您經(jīng)常會(huì)得到帶有參數(shù)的警告。self.title = titleself.rating = rating:

@implementation ScaryBugData@synthesize title;@synthesize rating;- (id)initWithTitle:(NSString *)title rating:(float)rating {
    if (self = [super init]) {
        self.title = title; // Warning. Local declaration hides instance variable
        self.rating = rating; // Warning. Local declaration hides instance variable
    }
    return self;}@end

您可以通過對(duì)實(shí)例變量打分來避免警告:

@implementation ScaryBugData
    @synthesize title = _title;
    @synthesize rating = _rating;
    - (id)initWithTitle:(NSString *)title rating:(float)rating {
        if (self = [super init]) {
            self.title = title; // No warning
            self.rating = rating; // No warning
        }
        return self;
    }
    @end




查看完整回答
反對(duì) 回復(fù) 2019-07-28
?
明月笑刀無情

TA貢獻(xiàn)1828條經(jīng)驗(yàn) 獲得超4個(gè)贊

在DIDFinishLaunchingWithOptions:Method應(yīng)用程序中,使用Self引用窗口和viewControllerIvars

不,他們不是。這些都是對(duì)特性 windowviewController..這就是下劃線的要點(diǎn),以便使屬性在使用時(shí)(不使用下劃線)和IVAR被直接訪問(帶有下劃線)時(shí)更加清晰。




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

添加回答

舉報(bào)

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號(hào)

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