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

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

好处是:如果指定capacity,而且元素数量没有超过这个值的话就不需要老是欲求不满找系统要内存,而找系统要内存这个操作会带来一定的系统开销(涉及到系统调用,当然我们使用起来事实上是感受不到这个区别的)。  
缺点是:如果实际元素个数也capacity相差甚远就浪费了内存空间。

所以这里有个tradeoff,要根据实际情况来操作。 
在without capacity的情况下,事实上应该也是有个默认的capacity的,具体是多少应该和实现有关系,一般来说是10/12大约?

iOS:NSMutableArray alloc/init 和 arrayWithObjects 之间的区别

答:一个是创建对象以后用对象消息初始化,另一个是直接用类消息创建对象+初始化。后者显然写着省事点
有这么几点,知道就好了,这个不必深究的:
1,initWithCapacity:10 并不代表里面的object数量不能大于10.也可以大于10.
2,init是在告诉程序,“我不知道要放多少object,暂且帮我初始化”。
3,如果你知道大概要放多少东西,那么最好用initWithCapacity,这个会提高程序内存运用效率。
4,如果你初始化了NSMutableDictionary,并且很长时间不会用到,建议用initWithCapacity:0。
时间: 2024-10-08 02:34:22

[[NSMutableArray alloc] init];和[[NSMutableArray alloc] initWithCapacity:0]区别的相关文章

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.那么,他们两者之间到底有什么区

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

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成功.

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; ? ? retu

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,在一些代码中还是会看

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], 还有去面试的时候,也很可能被问到这个问题.

.Net的StringBuilder实现在4.0和2.0区别

.Net 4.0重构了StringBuilder的实现,采用了新的数据存储方式,不仅在效率上有大的提高,并且彻底避免了中间处理过程出现临时String对象进入LOH大对象堆的情况.本文对此进行分析. 回顾.Net 2.0的StringBuilder实现 Reflector查看StringBuilder的实现: 其内部数据存储结构为string(对应成员变量m_StringValue).StringBuilder的构造函数可以依据指定的字符串和容量来初始化,默认为空串(string.Empty),

python2.0 和python3.0区别

python2.0 和python3.0区别 1.官方解释:    python2.0是过去的遗产:      python3.0是未来使用的.  (去繁从简) 2.语法区别:    python2.0    print "hello"    python3.0    print ("hello")    3.编码不同:    python2.0    不能直接写中文:必须先声明utf-8  如:#-*- coding:utf-8 -*-    python3.0