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

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

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

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

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

3 回答

?
鴻蒙傳說

TA貢獻1865條經驗 獲得超7個贊

這是Object-C運行時以前版本的工件。

最初,@synthesize用于創建訪問器方法,但運行庫仍然要求實例變量必須顯式實例化:

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

人們會在實例變量前加上前綴,以區分它們與屬性(盡管Apple不希望您使用下劃線,但這是另一回事)。將該屬性合成為指向實例變量的屬性。但重點是_qux是一個實例變量,并且self.qux(或[self qux])是消息qux發送到對象self.

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

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

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

  • 您可能最終會觸發一些意外的通知。其他對象可能正在觀察對

    qux

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

    對象已被解除分配,您正在做一些嚴重錯誤的事情。因為目標-C

    nil

    -消息傳遞語義,但是,您永遠不會知道,已經使用訪問器設置為

    nil

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

    EXC_BAD_ACCESS.

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

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

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

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

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

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

可悲的是,蘋果的示例代碼和模板代碼糟糕透了。永遠不要用它作為正確的目標-C風格的指南,當然也不要用它作為正確的軟件體系結構的指南。*)




查看完整回答
反對 回復 2019-07-26
?
qq_笑_17

TA貢獻1818條經驗 獲得超7個贊

這是另一個原因。在不突出實例變量的情況下,您經常會得到帶有參數的警告。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

您可以通過對實例變量打分來避免警告:

@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




查看完整回答
反對 回復 2019-07-26
?
慕勒3428872

TA貢獻1848條經驗 獲得超6個贊

在DIDFinishLaunchingWithOptions:Method應用程序中,使用Self引用窗口和viewControllerIvars

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



查看完整回答
反對 回復 2019-07-26
  • 3 回答
  • 0 關注
  • 468 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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