全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

IOS 中 new 和 alloc init 的对比

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 源码流程示例分析  # 是个  # 隐式  # 可以用  # 推荐使用  # 你想  # 这个问题  # 它是  # 也很  # 就把  # 希望能  # 你不会  # 谢谢大家  # 问到  # 接触到  # 总比  # 而为  # 有什么区别  # 配了  # 发现了  # 最初 


相关文章: 安徽网站建设与外贸建站服务专业定制方案  如何用西部建站助手快速创建专业网站?  建站之星如何保障用户数据免受黑客入侵?  C++中引用和指针有什么区别?(代码说明)  如何规划企业建站流程的关键步骤?  如何在万网开始建站?分步指南解析  建站之星安装步骤有哪些常见问题?  北京的网站制作公司有哪些,哪个视频网站最好?  北京网站制作公司哪家好一点,北京租房网站有哪些?  已有域名和空间如何快速搭建网站?  python的本地网站制作,如何创建本地站点?  建站上市公司网站建设方案与SEO优化服务定制指南  香港服务器网站生成指南:免费资源整合与高速稳定配置方案  怀化网站制作公司,怀化新生儿上户网上办理流程?  网站制作公司排行榜,抖音怎样做个人官方网站  如何在阿里云购买域名并搭建网站?  较简单的网站制作软件有哪些,手机版网页制作用什么软件?  如何选择CMS系统实现快速建站与SEO优化?  c# 在高并发场景下,委托和接口调用的性能对比  如何设置并定期更换建站之星安全管理员密码?  c# Task.Yield 的作用是什么 它和Task.Delay(1)有区别吗  如何在阿里云香港服务器快速搭建网站?  网站制作员失业,怎样查看自己网站的注册者?  建站之星多图banner生成与模板自定义指南  网站制作企业,网站的banner和导航栏是指什么?  已有域名建站全流程解析:网站搭建步骤与建站工具选择  如何撰写建站申请书?关键要点有哪些?  北京建设网站制作公司,北京古代建筑博物馆预约官网?  建站主机选择指南:服务器配置与SEO优化实战技巧  济南网站制作的价格,历城一职专官方网站?  建站之星代理平台如何选择最佳方案?  ,购物网站怎么盈利呢?  如何在宝塔面板中修改默认建站目录?  网站制作外包价格怎么算,招聘网站上写的“外包”是什么意思?  如何解决VPS建站LNMP环境配置常见问题?  高端建站三要素:定制模板、企业官网与响应式设计优化  建站中国官网:模板定制+SEO优化+建站流程一站式指南  如何快速生成高效建站系统源代码?  免费制作统计图的网站有哪些,如何看待现如今年轻人买房难的情况?  如何制作网站标识牌,动态网站如何制作(教程)?  如何用狗爹虚拟主机快速搭建网站?  焦点电影公司作品,电影焦点结局是什么?  宁波自助建站系统如何快速打造专业企业网站?  专业制作网站的公司哪家好,建立一个公司网站的费用.有哪些部分,分别要多少钱?  怎么制作一个起泡网,水泡粪全漏粪育肥舍冬季氨气超过25ppm,可以有哪些措施降低舍内氨气水平?  如何在阿里云部署织梦网站?  历史网站制作软件,华为如何找回被删除的网站?  网站建设设计制作营销公司南阳,如何策划设计和建设网站?  如何快速搭建安全的FTP站点?  如何通过免费商城建站系统源码自定义网站主题与功能? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。