[Objective-C] self 和 this 的区别

转载 2015年07月10日 08:19:08

参考:

http://stackoverflow.com/questions/3810824/difference-b-w-objective-cs-self-and-cs-this

http://stackoverflow.com/questions/2385980/objective-c-when-to-use-self


【self 和 this 的区别】


this 是 C++ 语言的关键字,而 self 只是一个变量名。this 永远是当前对象的指针,而 self 的值是可以被修改的,在构造器中,当构造失败时,可以 self = nil,以标记失败,子类在调用 self = [super init] 发现 self 为 nil 时,就不必继续做自己的构造了。

可以定义变量名为 self,但对 this 是不可以的。

Objc 的 self 未必和 this 是等价的,即 self 未必指向当前对象,在使用时要注意。


【什么情况下用 self,什么情况下不用 self】


在  Apple's iPhone 'Utility Aplication' template 中出现的下列代码,

- (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];

}
其中,既有 self.mainViewController = aController; 的用法,又有 mainViewController.view.frame = [UIScreen mainScreen].applicationFrame; 的用法,有人会问,什么情况下用 self,什么情况下不用 self?


答案是:


用了 self.xxx 就会调用 [self getXXX] 或 [self setXXX](看是lvalue or  rvalue)。例如


1)

self.mainViewController = aController;
等价于

[self setMainViewController:aController];
即,通过 setter 函数来改变 mainViewController 指针的值,其中可能会涉及到诸如”releasing old objects, retaining new ones, updating internal variables“的操作


2)而

mainViewController = aController;
还是它自己,只是简单的直接改变 mainViewController 指针的值,不经由 setter 方法。

3)

mainViewController.view.frame = [UIScreen mainScreen].applicationFrame;
会被翻译成

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


建议的做法:

尽量用 [self setMainViewController:aController]; 的方式,尽量不用 mainViewController = aController; 的方式。原因在于:it's still possible that accessing directly could break something in a future version of Cocoa Touch

C++的this,Objective-C的self

C++中定义类的实例方法如下: void MyClass::method(int arg) {   printf(“%p %d\n”, this, arg); } C++编译器将该方法作为C语...

Objective-C的语法对比(和Java的对比)

Objective-C的语法对比(和Java的对比) 1、函数的对比 例子: helloworld方法 Java 语言:     public void helloWorld...

Objective-C语言--self和super关键字解析

Objective-C中self和super关键字分析

Objective-C中的self和super

《ObjC.pdf》 发送消息给self和super Objective C提供了两个保留字self和super,用于在方法定义中引用执行该方法的对象。例如,假设你定义了一个方法repos...

js中var self=this的解释

每个函数在定义被ECMAScript解析器解析时,都会创建两个特殊的变量:this和arguments,换句话说,每个函数都有属于自己的this对象,这个this对象是在运行时基于函数的执行环境绑定的...

PHP5中的this,self和parent关键字详解

PHP5中的this,self和parent关键字详解文/heiyeluren2004/11/03PHP5是一具备了大部分面向对象语言的特性的语言,比PHP4有了很多的面向对象的特性,但是有部分概念也...

objective-c中self.xxx和_xxx的区别与用法

关于@synthesis、变量、属性、属性名前面下划线的问题 那个下划线只是为了方便区别全局变量和本地变量,或者防止变量重名,只是一种编程风格,实际上对代码没有实质影响,更无法替代@synthe...
  • chjx501
  • chjx501
  • 2015年05月10日 20:12
  • 613

IOS开发Objective-C基础之—self.用法

什么时候用self.赋值的问题, 在网上搜索一些网友的解释,在此说明一下:     关于什么时间时候用self. , 其实是和Obj-c的存取方法有关, 不过网上很多人也都这么解答的, 那它为什...
  • zl90hou
  • zl90hou
  • 2012年03月07日 19:39
  • 163

Objective-C初始化对象的时候为什么总是有一句:if (self = [super init])

摘自:http://www.oschina.net/question/54100_32468 众所周知,Objective-C是一门面向对象的语言,一般情况下,我们在Objective-C中定义一个类...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:[Objective-C] self 和 this 的区别
举报原因:
原因补充:

(最多只允许输入30个字)