[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

相关文章推荐

Xcode中Objective-C和C++混编的实现(一)

最近在做一个项目需要把OpenCV 的代码移植到iOS中,在移植过程中遇到了很多问题,其中最关键的就是OC与C++混编的问题,找了很多资料和弯路终于走通了,现在把思路整理好做个笔记.希望能给有需要的朋...

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

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

Objective-C的self.用法的一些总结

转载自:http://www.cocoachina.com/newbie/basic/2012/0116/3884.html 关于什么时间用self. , 其实是和Obj-c的存取方法有关, ...

Objective-C 中Self 和 Super 详解

Objective-C 中Self 和 Super 详解本文要介绍的内容,在 Objective-C 中的类实现中经常看到这两个关键字 self 和 super,以以前 oop 语言的经验,拿 c...

Objective-C的self.用法的一些总结

此文转自http://www.weste.net/2011/2-23/74364.html  最近有人问我关于什么时候用self.赋值的问题, 我总结了一下, 发出来给大家参考. 有什么问题请大家斧...

Objective-C的self.用法的一些总结

关于什么时间用self. , 其实是和Obj-c的存取方法有关, 不过网上很多人也都这么解答的, 那它为什么和存取方法有关? 怎么有关的? 并没有多少人回答出来. 同时关于内存管理的内容, 请大家看旺...

Objective-C的self.用法的一些总结

最近有人问我关于什么时候用self.赋值的问题, 我总结了一下, 发出来给大家参考. 有什么问题请大家斧正.     关于什么时间用self. , 其实是和Obj-c的存取方法有关, 不过网上很...

Objective-C中的self和super

@转载自http://blog.csdn.net/datacloud/article/details/7275170 发送消息给self和super Objective C提供了两个保留字self...

在Objective-C中何时用self.何时不用?

在Objective-C中何时用self.何时不用?(非常重要的基础语法知识)      今天在看《iPhone开发基础教程》第七章的时候,代码比着书上的写,但是出错了。排了下错发现是在数据源的一个...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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