黑马程序员技术交流社区

标题: 实例化对象的两种方式,有何不同点? [打印本页]

作者: 王雪冬    时间: 2014-4-6 20:16
标题: 实例化对象的两种方式,有何不同点?
本帖最后由  王雪冬 于 2014-4-6 20:20 编辑

我在视频里看到的,通过一个类,创建该类的方式是:
  1. int main()
  2. {
  3.          TheClass *tc1 =[TheClass new]; // 其中TheClass 是已经声明和实现的类
  4.       
  5.         return 0;
  6. }
复制代码



我看李明杰来老师的博客,是这样:
  1. int main()
  2. {
  3.       TheClass *tc1 =[[TheClass alloc] init]; // 其中TheClass 是已经声明和实现的类
  4.       
  5.         return 0;
  6. }
复制代码


请问大神们,着两种方式有何不一样?比如从性能方面,比如在创建存储空间时的不同点
















作者: 脸皮猴    时间: 2014-4-6 21:59
我记得老说是这个是一个意思,[TheClass new]就等于[[TheClass alloc] init],但是这种new这种方式真正的开发中老实说不常用,因为有局限性,第二种可以先 alloc再进行别的初始化,比如重写构造方法,直接调用自己写的构造方法,对对象的成员变量进行自定义的初始化。
作者: conpgy    时间: 2014-4-6 22:25
本帖最后由 conpgy 于 2014-4-6 22:30 编辑

[[TheClass alloc] init] 可以自己设计初始化的时候该做些什么。比如给实例变量赋值啊,创建对象啊等等。而且可以构造便利初始化函数。比如:initWithForamat:等什么。而使用[TheClass new]执行默认的初始化。
作者: 于清扬    时间: 2014-4-6 23:38
TheClass *tc1 =[TheClass new];这个方法其实就是先调用alloc方法分配存储空间再调用init初始化对象,
TheClass *tc1 =[[TheClass alloc] init];这样分开写可以在你的类中重写构造方法(init),便于在初始化对象的时候做些别的事情,比如创建出来的人都是10岁之类的。
作者: 程浩    时间: 2014-4-7 10:16

下面这句就是new出来的,但是由于它调用了类方法  

Person *p = [Person new];//+ (id)new;  


下面是使用了对象方法init创建的这又几点好处

1.可以重写 - (id)init 方法,也就是说,我们可以把控程序的实现细节,new虽然可以,但是他封装了这个方法。

2.由于使用了alloc ,对象计数器会加1,这样可以管理内存中对象的释放,当然,用Arc就更方便了

3.先分配存储空间+alloc,再初始化-init,初始值是0,这样理论上会比new快一点点

Person *p2=[[Person alloc] init];//以后开发都这么写


new 和 alloc/init 的区别

1.区别只在于alloc分配内存是使用了zone

zone:它是给对象分配内存的时候,把关联的对象分配到一个相邻的内存区域内,以便于调用时消耗很少的代价,提升了程序处理速
2.不推荐new是因为,如果你想调用allocXXX方法,就不可以了。









欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2