Objective-C – 何时使用“自我”

这是来自苹果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分配给一个mainViewController ,指定self关键字:

  self.mainViewController = aController; 

但是,当设置mainViewController的框架时, mainViewController self关键字:

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

如果我从第一个示例中删除了self关键字,程序就会与消息一起崩溃:

 objc[1296]: FREED(id): message view sent to freed object=0x3b122d0 

如果我添加self关键字到第二个例子,程序运行良好。

任何人都可以解释为什么self需要在第一个案件,但不是第二个? 我假设在这两种情况下mainViewController指的是相同的实例variables。

使用self会导致你的类“setter”被调用,而不是直接改变伊娃。

 self.mainViewController = aController; 

相当于:

 [self setMainViewController:aController]; 

另一方面:

 mainViewController = aController; 

直接更改mainViewController实例variables,跳过可能内置于UIApplication的setMainViewController方法中的任何附加代码,例如释放旧对象,保留新对象,更新内部variables等等。

在你访问框架的情况下,你仍然在调用setter方法:

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

扩展到:

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

理想情况下,为了将来validation你的代码,你也应该在获取这个值的时候使用self.mainViewController (或者[self mainViewController] )。 一般而言,类在“getter”方法中的重要代码比在“setter”中的可能性要小得多,但直接访问仍然有可能在未来版本的Cocoa Touch中破坏某些东西。

self关键字表示您正在使用属性getter / setter,而不是直接访问该值。 如果让getter / setter使用同步自动生成,则必须在第一个示例中使用self,因为该对象保留在那里而不是简单地指针分配。