IOS 中 new 和 alloc init 的对比

发布时间 - 2026-01-10 23:12:45    点击率:

IOS 中 new 和 alloc init 的对比

1.在实际开发中很少会用到new,一般创建对象咱们看到的全是[[className alloc] init]

但是并不意味着你不会接触到new,在一些代码中还是会看到[className new],

还有去面试的时候,也很可能被问到这个问题。

2.那么,他们两者之间到底有什么区别呢

我们看源码:

+ new 
{ 
id newObject = (*_alloc)((Class)self, 0); 
Class metaClass = self->isa; 
if (class_getVersion(metaClass) > 1) 
return [newObject init]; 
else 
return newObject; 
} 
 
//而 alloc/init 像这样: 
+ alloc 
{ 
return (*_zoneAlloc)((Class)self, 0, malloc_default_zone()); 
} 
- init 
{ 
return self; 
} 

通过源码中我们发现,[className new]基本等同于[[className alloc] init];

区别只在于alloc分配内存的时候使用了zone.

这个zone是个什么东东呢?

它是给对象分配内存的时候,把关联的对象分配到一个相邻的内存区域内,以便于调用时消耗很少的代价,提升了程序处理速度;

3.而为什么不推荐使用new?

不知大家发现了没有:如果使用new的话,初始化方法被固定死只能调用init.

而你想调用initXXX怎么办?没门儿!据说最初的设计是完全借鉴Smalltalk语法来的。

传说那个时候已经有allocFromZone:这个方法,

但是这个方法需要传个参数id myCompanion = [[TheClass allocFromZone:[self zone]] init];

这个方法像下面这样:

+ allocFromZone:(void *) z 
{ 
return (*_zoneAlloc)((Class)self, 0, z); 
} 
 
//后来简化为下面这个: 
+ alloc 
{ 
return (*_zoneAlloc)((Class)self, 0, malloc_default_zone()); 
} 

但是,出现个问题:这个方法只是给对象分配了内存,并没有初始化实例变量。

是不是又回到new那样的处理方式:在方法内部隐式调用init方法呢?

后来发现“显示调用总比隐式调用要好”,所以后来就把两个方法分开了。

概括来说,new和alloc/init在功能上几乎是一致的,分配内存并完成初始化。

差别在于,采用new的方式只能采用默认的init方法完成初始化,

采用alloc的方式可以用其他定制的初始化方法。

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!


# IOS  #   # new  #   # alloc  # init  # 的对比  # new与  # init分析  # iOS底层实例解析Swift闭包及OC闭包  # iOS开发底层探索界面优化示例详解  # iOS底层探索之自动释放池原理解析  # iOS系统的底层通知框架库示例详解  # iOS中id类型的理解及底层原理详解  # iOS 底层alloc init new 源码流程示例分析  # 是个  # 隐式  # 可以用  # 推荐使用  # 你想  # 这个问题  # 它是  # 也很  # 就把  # 希望能  # 你不会  # 谢谢大家  # 问到  # 接触到  # 总比  # 而为  # 有什么区别  # 配了  # 发现了  # 最初 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: php嵌入式断网后怎么恢复_php检测网络重连并恢复硬件控制【操作】  长沙企业网站制作哪家好,长沙水业集团官方网站?  怎么用AI帮你设计一套个性化的手机App图标?  5种Android数据存储方式汇总  JS去除重复并统计数量的实现方法  如何在IIS服务器上快速部署高效网站?  Android GridView 滑动条设置一直显示状态(推荐)  Laravel如何使用Livewire构建动态组件?(入门代码)  实例解析Array和String方法  浏览器如何快速切换搜索引擎_在地址栏使用不同搜索引擎【搜索】  如何用低价快速搭建高质量网站?  大连网站制作公司哪家好一点,大连买房网站哪个好?  Laravel怎么调用外部API_Laravel Http Client客户端使用  电商网站制作多少钱一个,电子商务公司的网站制作费用计入什么科目?  百度输入法ai组件怎么删除 百度输入法ai组件移除工具  Laravel Seeder怎么填充数据_Laravel数据库填充器的使用方法与技巧  深圳网站制作的公司有哪些,dido官方网站?  Laravel队列任务超时怎么办_Laravel Queue Timeout设置详解  如何破解联通资金短缺导致的基站建设难题?  Laravel怎么实现API接口鉴权_Laravel Sanctum令牌生成与请求验证【教程】  如何快速搭建虚拟主机网站?新手必看指南  深入理解Android中的xmlns:tools属性  Linux网络带宽限制_tc配置实践解析【教程】  如何在 Python 中将列表项按字母顺序编号(a.、b.、c. …)  专业型网站制作公司有哪些,我设计专业的,谁给推荐几个设计师兼职类的网站?  JavaScript如何实现音频处理_Web Audio API如何工作?  ChatGPT常用指令模板大全 新手快速上手的万能Prompt合集  Laravel全局作用域是什么_Laravel Eloquent Global Scopes应用指南  如何在 Go 中优雅地映射具有动态字段的 JSON 对象到结构体  html5的keygen标签为什么废弃_替代方案说明【解答】  javascript基于原型链的继承及call和apply函数用法分析  Windows Hello人脸识别突然无法使用  Windows11怎样设置电源计划_Windows11电源计划调整攻略【指南】  如何在宝塔面板中创建新站点?  Linux系统命令中tree命令详解  ,在苏州找工作,上哪个网站比较好?  Win11关机界面怎么改_Win11自定义关机画面设置【工具】  如何快速查询网站的真实建站时间?  如何在阿里云域名上完成建站全流程?  Laravel如何实现模型的全局作用域?(Global Scope示例)  Laravel怎么使用Blade模板引擎_Laravel模板继承与Component组件复用【手册】  Python高阶函数应用_函数作为参数说明【指导】  HTML5段落标签p和br怎么选_文本排版常用标签对比【解答】  Gemini手机端怎么发图片_Gemini手机端发图方法【步骤】  创业网站制作流程,创业网站可靠吗?  手机网站制作平台,手机靓号代理商怎么制作属于自己的手机靓号网站?  Edge浏览器怎么启用睡眠标签页_节省电脑内存占用优化技巧  使用豆包 AI 辅助进行简单网页 HTML 结构设计  Laravel如何使用缓存系统提升性能_Laravel缓存驱动和应用优化方案  如何彻底卸载建站之星软件?