一、问题起源
一切起源于Apple官方文档里面关于单例(Singleton)的示范代码:Creating a Singleton Instance.
复制代码 其中:
复制代码 这段有另一个版本,不使用 allocWithZone 而是直接 alloc,如下:
复制代码 这就引发了一个讨论,为什么要覆盖allocWithZone方法,到底 alloc 和 allocWithZone 有啥区别呢? 二、allocWithZone
文档里面提到,memory zone已经被弃用了,只是历史原因才保留这个接口。详细是什么历史原因我没找到,不过后面介绍的内容会稍微涉及到。 三、NSZone
大意上是说NSZone是Apple用来分配和释放内存的一种方式,它不是一个对象,而是使用C结构存储了关于对象的内存管理的信息。基本上开发者是不需要去理会这个东西的,cocoa Application使用一个系统默认的NSZone来对应用的对象进行管理。那么在什么时候你会想要有一个自己控制的NSZone呢?当默认的NSZone里面管理了大量的对象的时候。这种时候,大量对象的释放可能会导致内存严重碎片化,cocoa本身有做过优化,每次alloc的时候会试图去填满内存的空隙,但是这样做的话时间的开销很大。于是乎,你可以自己创建一个NSZone,这样当你有大量的alloc请求的时候就全部转移到指定的NSZone里面去,减少了大量的时间开销。而且,使用NSZone还可以一口气把你创建的zone里面的东西都清除掉,省掉了大量的时间去一个个dealloc对象。 四、结论 |
从 Objective-C 里的 Alloc 和 AllocWithZone 谈起
时间: 2024-10-07 13:44:29
从 Objective-C 里的 Alloc 和 AllocWithZone 谈起的相关文章
【OC学习-11】ARC和内存管理里面的alloc、assign、new、retain、copy、mutableCopy、release说明
一般我们在开发程序时,只管alloc,不需要管release,因为有ARC帮我们管理.但是在学习时仍需要了解:内存是有限的,在堆区分配了内存后,如果不需要,则要回收,不然内存不够引起崩溃. 所以原则是:有分配,就有回收.但是这个分配有可能分配好几次,那么回收怎么知道回收几次呢?这就是引用计数的作用.创建一个对象时,它自带了这个引用计数. (1)alloc.new.copy.mutableCopy和retain时,引用计数+1,即retainCount+1; (2)release时,引用计数ret
allocWithZone
从 Objective-C 里的 Alloc 和 AllocWithZone 谈起 Creative Commons 共享创意许可,转载请注明来源 一.问题起源 一切起源于Apple官方文档里面关于单例(Singleton)的示范代码:Creating a Singleton Instance. 主要的争议集中在下面这一段: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 static MyGizmoClass *sharedGizmoManager = nil; + (MyG
Objective-C
1.Objective-C语言特性 2.static __block const 3.Object-C的内存管理 4.RunLoop 5.iOS消息传递机制 6.iOS程序生命周期 7.MVC设计模式MVVM 8.UIView CALayer Frame 与bounds 9.根类 NSObject 10.多线程简介 11.数据持久化 12.JSON和XML HTML 自定义报文 13.网络编程 HTTP TCP/IP Socket ASI AFNetwork 14.AppStore上传 及远程
iOS Objective -C Runtime 运行时之一: 类与对象
// --------------------------------------------------- 参考:南峰子的技术博客 http://southpeak.github.io //---------------------------------------------------- OC语言是一门动态语言,它将很多静态语言在编译和链接时期做的事放到了运行时来处理.这种动态语言的优势在于:我们编写代码时更具灵活性,如我们可以把消息转发给我们想要的对象,或者随意交换一个方法的实现等.
Objective-O Runtime 运行时初体验
Objective-C语言是一门动态语言,它将很多静态语言在编译和链接时期做的事放到了运行时来处理.这种动态语言的优势在于:我们写代码时更具灵活性,如我们可以把消息转发给我们想要的对象,或者随意交换一个方法的实现等. 这种特性意味着Objective-C不仅需要一个编译器,还需要一个运行时系统来执行编译的代码.对于Objective-C来说,这个运行时系统就像一个操作系统一样:它让所有的工作可以正常的运行.这个运行时系统即Objc Runtime.Objc Runtime其实是一个Runtime
iOS开发——实战总结OC篇&;alloc和allocWith总结
alloc和allocWith总结 以下是官方公布的单例写法 运行结果如下图: 很明显,我们在调用alloc的时候,默认的alloc会调用allocWithZone方法 接着看下图: 可以看出,单例是生效的,调用alloc 和 调用allocWithZone生成的单例是相等的. 接下来,我们对官方例子做一个修改: 屏蔽allocWithZone后测试效果如下: 综上可以知道: 1.alloc和allocWithZone都可以用于创建实例(其实是用于创建实例的时候分配内存空间) 2.alloc会默
SQL Server里的闩锁耦合(Latch Coupling)
几年前,我写了篇关于闩锁和为什么SQL Server需要它们的文章.在今天的文章里,我想进一步谈下非缓存区闩锁(Non-Buffer Latches),还有在索引查找操作期间,SQL Server如何使用它们.在这里你会学到称为闩锁耦合(Latch Coupling)的概念. 索引查找操作(Index Seek Operations) 正如你知道的,SQL Server使用扫描(Scan)和查找(Seek)操作在索引(聚集和非聚集索引)里访问数据.这里的查找操作使用B树的导航结构在叶子节点查找特
iOS面试笔试题附部分答案
面试反正看面试官水平和心情,我遇到的比较怪的问题还有"你觉得你是个有爱的人吗?"哈哈哈哈...只能说整理些下面是自己整理的,答案不一定对,哪里错了望不吝指正. iOS面试题集锦 至少10款以上iOS领域的开源组件: AFNetworking (NSURLConnction+NSOperation), Masonry,SDWebImage,MBProgreeHUD,MJRefresh,MWPhotoBrowser ,JSONKit http://www.jianshu.com/p/207
Objective-C对象之类对象和元类对象
作者:wangzz 原文地址:http://blog.csdn.net/wzzvictory/article/details/8592492 转载请注明出处 如果觉得文章对你有所帮助,请通过留言或关注微信公众帐号wangzzstrive来支持我,谢谢! 作为C语言的超集,面向对象成为Objective-C与C语言的最大区别,因此,对象是Objective-C中最重要的部分之一.目前面向对象的语言有很多,Objective-C中的对象又和其他语言中的对象有什么区别呢?下面来简单介绍Objectiv