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作用域_全局和局部作用域有什么区别?  网站制作价目表怎么做,珍爱网婚介费用多少?