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,因为该对象保留在那里而不是简单地指针分配。