【Objective-C】基础学习笔记——对象初始化

【Objective-C】基础学习笔记——对象初始化,第1张

概述      学习书目:Learn Objective-C on the Mac       obj中创建新对象有两种方式:[classname new]和[[classname alloc] init]。两种方法等价,Cocoa惯例是使用alloc和init。   1.分配对象:       allocation是一个新对象诞生过程,从OS获得一块内存并指定为存放对象的实例变量的位置。同时allo

      学习书目:Learn Objective-C on the Mac

      obj中创建新对象有两种方式:[classname new]和[[classname alloc] init]。两种方法等价,Cocoa惯例是使用alloc和init。

 

1.分配对象:

      allocation是一个新对象诞生过程,从OS获得一块内存并指定为存放对象的实例变量的位置。同时alloc方法还将这块内存区域全部初始化为0。BOol初始化为NO,int初始化为0,float初始化为0.0,指针初始化为nil。

      然后init初始化之后才能使用,C++和Java中使用构造函数在单次 *** 作中执行对象的分配和初始化,Objective-C将两个 *** 作分开。

 

2.Car *car = [[Car alloc] init];

      -(ID)init

      {

         if(self=[super init])

        {

          engine=[Engine new];

          tires[0]=[Tire new];

        }

      }

      -(ID)init返回值,ID可表不同的对象。init可以接受参数并可能判断返回另外一个类的对象可能更合适。比如从一个很长的字符串生产一个新的字符串。

      if(self=[super init]) 首先的是[super init],使超类完成自己的初始化工作。使超类执行所需任何 *** 作,以便对象能响应消息并处理保留计数器。实例变量所在的内存位置到隐藏的self的距离是固定的,如果init方法返回一个新对象,则需要更新self,以便之后的实例变量的引用能映射到正确的内存位置,self=[super init]赋值就是这个作用,只影响init方法中self的值,不影响init范围以外的内容。初始化一个对象出错时,返回nil。if(self=[super init])典型的C风格,一般不采用self=[super init] if(self)...

      在car的初始化中给实例变量赋值并创建car所需要的engine和tires对象。可以一次创建所有所需要的对象,使得Car类可以[[Car alloc] init]之后可以立即使用;也可以先为engine对象和tire对象预留位置,等调用者需要的时候再创建对象,惰性求值(lazy evaluation)。

 

3.便利初始化函数。

      为了减少工作麻烦,很多对象有多个init开头的方法。Nsstring类为例子:

      Nsstring *emptyString = [[Nsstring alloc] init];

      Nsstring *str = [[Nsstring alloc] initWithFormat:@"%d or %d",2,33];

      Nsstring *str = [[Nsstring alloc] initWithContentsOffile:@"/tmp/1.txt"];

      Xcode提供的自动匹配功能非常使用,输入init按esc键后会显示所有的可以匹配的函数。

 

      所有使用alloc,copy,new方法创建的对象,只用完成之后都需要释放。[str release];

      Nsstring *str = [Nsstring stringWithFormat:@"%.1f",20.0];  str这里是可以自动释放的,当自动释放池销毁时,该字符串对象也被清理。

      一般在main函数首先创建自动释放池,为自动释放的对象在等待自动释放池被销毁时提供容身之所:

      NSautoreleasePool *pool;

      pool = [[NSautoreleasePool alloc] init];

      在程序结束时,pool释放,并向池中的所有对象发送release消息:

      [pool release];

 

4.指定初始函数

      我们可以自己编写方便的便利初始化函数,并且可以编写多个。但必须指定某个初始化方法为指定初始化函数,该类的所有初始化方法使用指定初始化函数执行初始化 *** 作。子类使用其超类的指定初始化函数实现超类的初始化。如果构造了一个初始化函数,需要在自己的指定初始化函数中调用超类的指定初始化函数。如果不指定初始化函数,那么该类子类可能需要重写所有的它的初始化函数。

总结

以上是内存溢出为你收集整理的【Objective-C】基础学习笔记——对象初始化全部内容,希望文章能够帮你解决【Objective-C】基础学习笔记——对象初始化所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1068212.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-26
下一篇 2022-05-26

发表评论

登录后才能评论

评论列表(0条)

保存