首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Objective-C -何时使用'self‘

Objective-C -何时使用'self‘
EN

Stack Overflow用户
提问于 2010-03-05 18:24:59
回答 2查看 22.6K关注 0票数 49

这是来自苹果iPhone‘实用程序应用’模板的未经修改的代码:

代码语言:javascript
复制
- (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关键字:

代码语言:javascript
复制
 self.mainViewController = aController;

但是,在设置mainViewController的frame时,不需要self关键字:

代码语言:javascript
复制
 mainViewController.view.frame = [UIScreen mainScreen].applicationFrame;

如果我从第一个示例中删除self关键字,程序将崩溃,并显示以下消息:

代码语言:javascript
复制
objc[1296]: FREED(id): message view sent to freed object=0x3b122d0

如果我将self关键字添加到第二个示例中,程序运行得很好。

有人能解释一下为什么在第一种情况下需要self,而在第二种情况下不需要吗?我假设在这两种情况下,mainViewController都引用相同的实例变量。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-03-05 18:31:46

使用self会导致调用这个变量的类的"setter“,而不是直接更改ivar。

代码语言:javascript
复制
self.mainViewController = aController;

等同于:

代码语言:javascript
复制
[self setMainViewController:aController];

另一方面:

代码语言:javascript
复制
mainViewController = aController;

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

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

代码语言:javascript
复制
mainViewController.view.frame = [UIScreen mainScreen].applicationFrame;

扩展为:

代码语言:javascript
复制
[[mainViewController view] setFrame:[[UIScreen mainScreen] applicationFrame]];

理想情况下,为了进一步证明您的代码,在检索此值时也应该使用self.mainViewController (或[self mainViewController])。一般来说,类的"getter“方法中包含重要代码的可能性要比”setter“小得多,但直接访问可能会破坏未来版本的Cocoa Touch中的某些内容。

票数 49
EN

Stack Overflow用户

发布于 2010-03-05 18:33:00

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

票数 11
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2385980

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档