self = [super init]
来源:互联网 发布:本域名受美国宪法保护 编辑:程序博客网 时间:2024/04/29 14:16
Objective-C的推荐init方法写法如下:
- (id) init{ if(self = [super init]) { //为子类增加属性进行初始化 } return self;}
返回值为id类型,id类型可以赋值给其他类型指针,其他类型指针也可以赋值给id类型
obc中子类指针不能直接赋值给父类指针
[super init]也是返回self,再不改变self所指向对象的情况下,这个self跟子类的self是一样的,因为转化为消息调用时传入的Receiver都一样
如果在父类中改变了self所指向的对象,可能出现意想不到的bug:
- (id) init{ id tmp = self; self = [AObj alloc]; [tmp release]; //other staffs return self;}BObj的init方法如下:
- (id) init{ if(self = [super init]) { //other staffs } return self;}这时编译能通过,但当BObj的实例使用到BObj扩充的属性时,就会出现一个运行时错误。错误的原因在于AObj的init方法用[AObj alloc]重新获得了一块仅仅适合存放AObj实例的空间。而BObj的init方法以为这是块适合存放BObj的空间。当试图读写BObj的扩充属性时便会产生运行时错误。
因此,当init方法需要重新alloc一块空间时,正确的写法如下:
- (id) init{ id tmp = self; self = [[self class] alloc]; [tmp release]; //other staffs return self;}注意第5行,[self class]将获得self指向的实例对应的类实例,本例中便是BObj。这样AObj的任何子类的init方法都能保证安全了
同样,在单例模式下,父类返回自己的对象(或把自己alloc出来的对象赋给self再返回),也会出现类似的bug,所以单例最好不要派生子类
http://blog.csdn.net/lamp_zy/article/details/8247563
- self = [super init]
- self = [super init]
- self = [super init]
- self = [super init]
- self = [super init]
- self = [super init]
- self==[super init]
- 关于 self = [super init];
- self = [super init]理解
- IOS self = [super init];
- self = [super init]; if (self) { 与 if (self == [super init]) { 的理解
- [iOS] 关于 self = [super init];
- [iOS] 关于 self = [super init];
- if(self=[super init]) 理解
- [iOS] 关于 self = [super init];
- [iOS] 关于 self = [super init];
- iOS 之self = [super init]
- self = [super init] 引发的思考
- 输入输出学生信息和成绩 利用结构体
- 剑指offer面试题7 两个栈实现队列和template的应用
- 第六周 项目四 求三角形面积,周长的类
- self与super的区别
- hdu 4465 Candy 快速全排列
- self = [super init]
- hdu1856-More is better
- Java ArrayList Collection.sort排序示例
- 数据结构之线段树
- 今天职业生涯课请的礼仪老师讲的求职礼仪
- NOJ37 回文字符串---整理一下都是各种回文类型啊,
- asp.net在IIS7中更改网站的.net framework框架版本
- 【并查集】HDU1272
- Android中处理软键盘上“回车键”的2种方法