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

一.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的优点,可以根据自己的需求来赋值.缺点就是,如果属性太多了的话,就要繁琐的赋值,会使得代码量加大.这就是我分享给大家的了.有什么做的不好的希望回馈.

 

  

   

 

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值