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

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

Objective-C-何時使用“自我”

Objective-C-何時使用“自我”

呼喚遠方 2019-11-14 09:11:51
這是來自Apple iPhone“實用程序”模板的未經修改的代碼:- (void)applicationDidFinishLaunching:(UIApplication *)application { MainViewController *aController = [[MainViewController alloc] initWithNibName:@"MainView" bundle:nil]; self.mainViewController = aController; [aController release]; mainViewController.view.frame = [UIScreen mainScreen].applicationFrame; [window addSubview:[mainViewController view]]; [window makeKeyAndVisible];}將mainViewController分配給時aController,self指定了關鍵字: self.mainViewController = aController;但是,mainViewController設置的框架后,self不需要關鍵字: mainViewController.view.frame = [UIScreen mainScreen].applicationFrame;如果我self從第一個示例中刪除了關鍵字,程序將崩潰并顯示以下消息:objc[1296]: FREED(id): message view sent to freed object=0x3b122d0如果我self在第二個示例中添加關鍵字,則程序運行正常。誰能解釋為什么self在第一種情況下需要這樣做,而在第二種情況下卻不需要?我假設在兩種情況下mainViewController都引用相同的實例變量。
查看完整描述

3 回答

?
慕村225694

TA貢獻1880條經驗 獲得超4個贊

使用self會導致您的類的“設置者”被調用,而不是直接更改ivar。


self.mainViewController = aController;

等效于:


[self setMainViewController:aController];

另一方面:


mainViewController = aController;

只需mainViewController直接更改實例變量,就可以跳過UIApplication setMainViewController方法中可能內置的任何其他代碼,例如釋放舊對象,保留新對象,更新內部變量等。


在訪問框架的情況下,您仍在調用setter方法:


mainViewController.view.frame = [UIScreen mainScreen].applicationFrame;

擴展為:


[[mainViewController view] setFrame:[[UIScreen mainScreen] applicationFrame]];

理想情況下,為了將來驗證您的代碼,也應該在檢索此值時也使用self.mainViewController(或[self mainViewController])。通常,類在其“ getter”方法中比在其“ setters”中具有重要代碼的可能性要小得多,但是直接訪問仍然有可能在將來的Cocoa Touch版本中破壞某些功能。


查看完整回答
反對 回復 2019-11-14
?
拉風的咖菲貓

TA貢獻1995條經驗 獲得超2個贊

self關鍵字表明您正在使用屬性的getter / setter方法,而不是直接訪問值。如果讓您使用同步功能自動生成getter / setter,則在第一個示例中必須使用self,因為對象保留在此處,而不僅僅是指針分配的對象。


查看完整回答
反對 回復 2019-11-14
?
慕尼黑5688855

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

除了在自己的getter和setter方法內部(如果您編寫自己的方法)之外,您應該始終使用self。這樣,可以自動為您處理對象保留。您還可以提供自定義代碼來執行諸如驗證iVar之類的操作,或者保留自零的功能。除了getter和setter方法之外,幾乎沒有任何直接訪問iVar的理由。雖然,許多人通常是出于錯誤或懶惰。

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

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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