构造方法
我们创建一个对象的时候一般喜欢直接调用一个类方法,比如有一个Person类,我们为这个Person类创建对象一般是直接这样[Person new];其实new是NSObject中的一个类方法,这个new方法中是先调用了alloc方法,alloc方法也是一个类方法,作用是创建这个类的对象,再将这个对象的指针返回;再调用创建的对象的对象方法init,作用是初始化创建的对象的属性,然后返回这个已经被初始化的对象。
比如: Person *p1 = [Person new];
完全等价于:
Person *p1 = [[Person alloc] init];
init方法叫做构造方法,它是定义于NSObject类中的一个对象方法,这个方法主要就是初始化所有的属性,基本类型属性初始化为0,非OC类型属性初始化为NULL,OC类型属性初始化为nil。因此,在默认情况下,我们创建一个对象,初始化完毕后,这个对象的属性都是有默认值的。
但是,如果我们想创建一个对象时对象的属性的默认值不是0、NULL、nil的时候,我们应该重写构造方法
OC基础复习之构造方法小结
Posted 忆缘晨风
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了OC基础复习之构造方法小结相关的知识,希望对你有一定的参考价值。
写到这里心慌慌的,压力骤然而起,
1.什么是构造方法?
OC构造方法
2.什么是重写构造方法?为什么要重写构造方法?
重写构造方法就是为了让属性初始化的时候按照我们自己的意愿,初始化一个值
格式是:
// 重写init方法 - (instancetype)init { // 先初始化父类的对象 self = [super init] if(self != nil) { // 初始化本类成员变量 -age = 10; } // 返回一个已经初始化好的对象 return self; }
那么重点来了,相信不止我一个人对为什么要加一条:self = [super init]产生疑问,
在经过我多次代码尝试和查阅资料得出自己的理解:
普遍疑问:[super init]显然是对父类的初始化,那么为什么要对父类初始化?我只对子类初始化不就够了,管你父类干嘛?
当程序进入到init这个方法的时候,系统已经生成了对象并分配了存储空间,在调用[super init]是为了初始化父类对象,在父类对象初始化过程序中有可能失败(如网络资源调用失败)或者返回其它对象(这个取决于你的父类了),这个时候会返回nil(只解释为nil)。如果父类对象为nil,子类对象其实没必要再执行了。当然这个时候的self其实也可以继续执行子类对象的初始化工作,因为都是同一个对象,只不过在你调用父类的某一些功能可能不起作用或者报错。
简言之就是父类可能初始化失败,所以要加一个判断以防万一(一般情况下是不会失败的)
父类可能在初始化中释放了当前的对象并创建了新的内存区域。
这时,子类需要将self指向新的内存区域才能正常工作。所以一定要执行self = [super init];
内存方面可能欠缺:以后学习了相关知识后可以参考一下文档:
http://blog.csdn.net/wihing/article/details/7316041
3.什么是自定义构造方法?怎么理解自定义构造方法的用处?
http://www.jianshu.com/p/a7cd668710da
以上是关于OC基础复习之构造方法小结的主要内容,如果未能解决你的问题,请参考以下文章