new和alloc init的区别

背景说明,new是较为老式的写法,后来发现只有一个new不好使,才引入了alloc和init这种写 法,保留new一是向后兼容,二是很多时候是一种更简单的写法。其实是一样的,new在内部调用 的alloc和init.

源代码:

+ new 

{ 

? ? id newObject = (*_alloc)((Class)self, 0); //申请空间 

? ? Class metaClass = self->isa; 

? ? Class metaClass = self->isa; 

? ? return [newObject init]; 

? ? //初始化 

? ? else 

? ? ? ? return newObject; 

} 

+ alloc 

{ 

? ? return (*_zoneAlloc)((Class)self, 0, malloc_default_zone()); 

}? 

- init 

{ 

? ? return self;? 

} 

[className new]基本等同于[[className alloc] init]. 区别只在于alloc分配内存的时候使用 了zone,这个zone是个什么东东呢?它是给对象分配内存的时候,把关联的对象分配到一个相邻 的内存区域内,以便于调用时消耗很少的代价,提升了程序处理速度.

什么要把alloc 和init 分开?

1. 可以使用多种init方法

2. 显示调用总比隐式调用要好

如果确实不需要用其他的init函数,比如initWithString, 只是使用 [Nsobject alloc] init] , 那用new的方法更加方便

* new doesn‘t support custom initializers (like initWithString) * alloc-init is more explicit than new

时间: 2024-10-26 13:29:34

new和alloc init的区别的相关文章

Objective-C中new与alloc/init的区别

在实际开发中很少会用到new,一般创建对象我们看到的全是[[className alloc] init],但是并不意味着你不会接触到new,在一些代码中还是会看到[className new],还有去面试的时候,也很可能被问到这个问题. 那么,它们两者之间到底有什么区别呢?我们先来看源码: + new { id newObject = (*_alloc)((Class)self, 0); Class metaClass = self->isa; if (class_getVersion(meta

iOS开发new与alloc/init的区别

概括来说,new和alloc/init在功能上几乎是一致的,分配内存并完成初始化.差别在于,采用new的方式只能采用默认的init方法完成初始化,采用alloc的方式可以用其他定制的初始化方法. AD: 英文详解:http://macresearch.org/difference-between-alloc-init-and-new 1.在实际开发中很少会用到new,一般创建对象咱们看到的全是[[className alloc] init] 但是并不意味着你不会接触到new,在一些代码中还是会看

iOS开发中 new与alloc/init的区别 及 [NSArray array] 和 [[NSArray alloc]init] 及 self. 和 _ 的区别

项目过程中,想到这几个概念的区别有些模糊,于是纵观各种资料,来篇博文为自己记录下,也为小伙伴们说说我的理解. [className new] 和 [[className alloc] init] 的区别 1.在实际开发中很少会用到new,一般创建对象咱们看到的全是[[className alloc] init] 但是并不意味着你不会接触到new,在一些代码中还是会看到[[className alloc] init], 还有去面试的时候,也很可能被问到这个问题. 2.那么,他们两者之间到底有什么区

OC 中new与alloc/init的区别

英文详解:http://macresearch.org/difference-between-alloc-init-and-new 1.在实际开发中很少会用到new,一般创建对象咱们看到的全是[[className alloc] init] 但是并不意味着你不会接触到new,在一些代码中还是会看到[className new], 还有去面试的时候,也很可能被问到这个问题. 2.那么,他们两者之间到底有什么区别呢 我们看源码: + new { id newObject = (*_alloc)((C

iOS new和alloc init的区别

今天同事跟我说新项目要求统一采用 [[xxx alloc]init]的方式创建,不要使用new. 于是宝宝心里就好奇了,为什么呢,在我的认知中,new和alloc init是一样的作用啊, 于是在网上搜了一下,发现了一篇有价值的文章,摘录下来与大家分享. 1.在实际开发中很少会用到new,一般创建对象咱们看到的全是[[className alloc] init] 但是并不意味着你不会接触到new,在一些代码中还是会看到[className new], 还有去面试的时候,也很可能被问到这个问题.

array=nil 和 Array=[[NSMutableArray alloc]init]; 的区别

情况1: array=nil; [_PayArray addObject:BillDetail]; 此时array还是nil:因为array没有分配地址应该. 情况2: Array=[[NSMutableArray alloc]init]; [_PayArray addObject:BillDetail]; 此时array添加BillDetail成功.

[[NSMutableArray alloc] init];和[[NSMutableArray alloc] initWithCapacity:0]区别

区别:第一个你创建NSMutableArray对象,它容纳对象个数是默认的.如果你知道最大需要的容量,那么就使用initWithCapacity:来设置,好处就是当元素个数不超过容量时,添加元素不需要重新分配内存.在with capacity的情况下,在初始化的时候分配的内存为n*sizeof(elem)--假设capacity为n.如果在使用的过程中需要加入更多的元素需要给array扩容了,那么必须去找系统再次要求分配内存,而这次要求的内存的大小和扩容因子有关系,如果扩容因子为2,那么扩容之后

alloc & init & dealloc

在Objective-C中,alloc,init和dealloc是经常使用的函数,那么它们内部到底是如何实现的呢?通过查看libobjc运行时库,可以发现他们的工作原理. 1 alloc alloc的功能就是为对象分配内存,关键代码如下: if (!UseGC && !zone && fast) { obj = (id)calloc(1, size); if (!obj) return nil; obj->initInstanceIsa(cls, hasCxxDtor

xcode7.0 lldb alloc init

(lldb) po [dicData objectForKey:@"tj"] <object returned empty description> (lldb) po @"" <object returned empty description> (lldb) po nil <nil> (lldb) po dicTJ.count error: Execution was interrupted, reason: Attempte