您的位置:首页 > 其它

OC中new方法与alloc+init及构造方法

2015-12-15 22:07 357 查看

一.new方法

当一个oc程序中,声明了属性,定义了方法,如何创建一个对象,创建的对象叫什么方法......?或许大家并没有懂得那么多,拿么接下来我将告诉你们在oc中是如何创建一个对象的,创建这个对象的时候,都在内存中干了什么事呢.

首先我告诉大家,当声明完属性和定义的方法的时候.在main函数内部将会通过new方法创建一个对象,而这个new 在内存空间干了三件事.



这就是new 方法在创建一个对象时候干得三件事.然后下面我将为你们附上自己经过理解画出来的用new方法创建对象在内存中的进过与访问.



由内存分析图可以看出,红色的箭头是由于对象创建完毕,访问方法时候的步骤.我们用一个简单的创建的代码来看看吧.



首先呢,创建的对象是在内存的堆区,可以看出有两个变量,然后第二步是给属性进行初始化,_age初始化为0,_name]初始化为空.然后就是第三步了,返回一个指针,然后返回出去的指针由p来接收.p也叫做对象名.再呢,就是如果你要调用方法,就是由调用者传入一个消息,传到p中,然后在内存中由isa指针取接收传来的消息,然后再由isa指针去内存代码区寻找相应的方法.比如上面那幅图找到得一个run的方法.所以,以上图就是创建对象到如何取内存中调用方法的图的分析.

二.alloc+init的用法

上面说了创建一个对象的new方法,接下来我将告诉大家一个和new 方法创建对象相等的alloc+init的方法,也是可以用来创建对象的,下面我们来看代码吧.



该段程序是和new方法创建对象相等的.分开来说吧,alloc是带表了new方法在创建对象的时候的前两个步骤,也就是申请一个内存空间,还有就是将创建的内存空间的首地址返回出去,这就是alloc做得事,然后就是init做的事了,初始化对象就是init做的事了.这其实也是将new的方法拆分的.当然,这样的方法其实也是由好处的,那么好处是什么呢?我们来看下面一段代码吧.



从代码我们能看出来,是不是能给属性附上自己想要的值啊,这样多方便啊.就是可能写的时候如果属性多了,那么写起来就有点繁琐了.

其实由上面的这段代码我们可以牵扯出自定义构造方法.具体什么是自定义构造方法呢.字面意思是可以根据我们自己的想法而构造出方法.这里构造方法我们有三种:1.重写;

2.自定义构造方法;3.子类继承父类自定义构造方法,在这里我就不明说了,就是给大家顺便提一下.我们来看下init在构造方法中起到得作用吧.



首先这是在Xcode中的起始步骤(一);



然后就是第二步;



再次就是第三步:该部分是一个控制部分,也可以说是自定义构造方法的主体吧.通过一个if语句来控制空间是否初始化,如果初始化了,由于会返回一个指针,然后用self去接(要记住不要看到super就以为这个过程是在父类,这是在子类完成的,子类只是调用而已.)由于self接到了一个不为0的指针,所以整个if语句为真,然后就会进行赋值了.反之就直接返回self.如果你要问我什么时候self会为0呢?那就是内存不够了,或者系统突然突然崩了,然后就是其它的了.当然,该部分是封装在内部的,是看不到的.



最后就是第四步了.也就是赋值,main函数的实现部分.我所附上的代码只是以个简单的代码,我只是想说明alloc+init的作用.从而衍生出自定义结构体.来和new方法做对比.

三.alloc+init的优缺点

如上面的说的,就是alloc+init的优点,可以根据自己的需求来赋值.缺点就是,如果属性太多了的话,就要繁琐的赋值,会使得代码量加大.这就是我分享给大家的了.有什么做的不好的希望回馈.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: