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 】
相关推荐:
宙斯浏览器文件分类查看教程 快速筛选视频文档与图片方法
网站制作软件有哪些,制图软件有哪些?
大型企业网站制作流程,做网站需要注册公司吗?
HTML5打空格有哪些误区_新手常犯的空格使用错误【技巧】
ai格式如何转html_将AI设计稿转换为HTML页面流程【页面】
Android利用动画实现背景逐渐变暗
Edge浏览器提示“由你的组织管理”怎么解决_去除浏览器托管提示【修复】
深圳防火门网站制作公司,深圳中天明防火门怎么编码?
Python企业级消息系统教程_KafkaRabbitMQ高并发应用
网站建设要注意的标准 促进网站用户好感度!
Laravel如何使用Laravel Vite编译前端_Laravel10以上版本前端静态资源管理【教程】
,在苏州找工作,上哪个网站比较好?
如何在 Pandas 中基于一列条件计算另一列的分组均值
php 三元运算符实例详细介绍
如何在建站之星绑定自定义域名?
三星网站视频制作教程下载,三星w23网页如何全屏?
使用PHP下载CSS文件中的所有图片【几行代码即可实现】
ChatGPT怎么生成Excel公式_ChatGPT公式生成方法【指南】
如何在IIS中配置站点IP、端口及主机头?
瓜子二手车官方网站在线入口 瓜子二手车网页版官网通道入口
Laravel Blade组件怎么用_Laravel可复用视图组件的创建与使用
BootStrap整体框架之基础布局组件
Java类加载基本过程详细介绍
Laravel队列任务超时怎么办_Laravel Queue Timeout设置详解
Laravel如何实现数据库事务?(DB Facade示例)
米侠浏览器网页背景异常怎么办 米侠显示修复
Laravel如何发送邮件_Laravel Mailables构建与发送邮件的简明教程
Python高阶函数应用_函数作为参数说明【指导】
英语简历制作免费网站推荐,如何将简历翻译成英文?
Laravel的契約(Contracts)是什么_深入理解Laravel Contracts与依赖倒置
Python正则表达式进阶教程_复杂匹配与分组替换解析
Laravel如何处理CORS跨域请求?(配置示例)
如何快速搭建高效WAP手机网站?
WEB开发之注册页面验证码倒计时代码的实现
新三国志曹操传主线渭水交兵攻略
Laravel如何使用API Resources格式化JSON响应_Laravel数据资源封装与格式化输出
如何为不同团队 ID 动态生成多个非值班状态按钮
免费网站制作appp,免费制作app哪个平台好?
微信小程序 input输入框控件详解及实例(多种示例)
佛山网站制作系统,佛山企业变更地址网上办理步骤?
如何确保西部建站助手FTP传输的安全性?
网站制作软件免费下载安装,有哪些免费下载的软件网站?
Laravel如何保护应用免受CSRF攻击?(原理和示例)
Laravel如何实现文件上传和存储?(本地与S3配置)
如何在景安云服务器上绑定域名并配置虚拟主机?
linux写shell需要注意的问题(必看)
Java遍历集合的三种方式
Laravel如何实现用户角色和权限系统_Laravel角色权限管理机制
什么是javascript作用域_全局和局部作用域有什么区别?
网站制作价目表怎么做,珍爱网婚介费用多少?

