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缓存驱动和应用优化方案
如何彻底卸载建站之星软件?

