这是来自苹果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
的frame时,不需要self
关键字:
mainViewController.view.frame = [UIScreen mainScreen].applicationFrame;
如果我从第一个示例中删除self
关键字,程序将崩溃,并显示以下消息:
objc[1296]: FREED(id): message view sent to freed object=0x3b122d0
如果我将self
关键字添加到第二个示例中,程序运行得很好。
有人能解释一下为什么在第一种情况下需要self
,而在第二种情况下不需要吗?我假设在这两种情况下,mainViewController
都引用相同的实例变量。
发布于 2010-03-05 18:31:46
使用self会导致调用这个变量的类的"setter“,而不是直接更改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“方法中包含重要代码的可能性要比”setter“小得多,但直接访问可能会破坏未来版本的Cocoa Touch中的某些内容。
发布于 2010-03-05 18:33:00
关键字self
表示您正在使用属性getter/setter,而不是直接访问值。如果您让getter/setter使用synchronize自动生成,则必须在第一个示例中使用self,因为对象保留在那里,而不是简单地分配指针。
https://stackoverflow.com/questions/2385980
复制相似问题