黑马程序员技术交流社区
标题: 实例化对象的两种方式,有何不同点? [打印本页]
作者: 王雪冬 时间: 2014-4-6 20:16
标题: 实例化对象的两种方式,有何不同点?
本帖最后由 王雪冬 于 2014-4-6 20:20 编辑
我在视频里看到的,通过一个类,创建该类的方式是:- int main()
- {
- TheClass *tc1 =[TheClass new]; // 其中TheClass 是已经声明和实现的类
-
- return 0;
- }
复制代码
我看李明杰来老师的博客,是这样:- int main()
- {
- TheClass *tc1 =[[TheClass alloc] init]; // 其中TheClass 是已经声明和实现的类
-
- return 0;
- }
复制代码
请问大神们,着两种方式有何不一样?比如从性能方面,比如在创建存储空间时的不同点
作者: 脸皮猴 时间: 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 |