国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 系統(tǒng) > iOS > 正文

IOS 中 new 和 alloc init 的對(duì)比

2019-10-21 18:48:16
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

IOS news/dongtai/173010.html">中 new 和 alloc init 的對(duì)比

1.在實(shí)際開(kāi)發(fā)中很少會(huì)用到new,一般創(chuàng)建對(duì)象咱們看到的全是[[className alloc] init]

但是并不意味著你不會(huì)接觸到new,在一些代碼中還是會(huì)看到[className new],

還有去面試的時(shí)候,也很可能被問(wèn)到這個(gè)問(wèn)題。

2.那么,他們兩者之間到底有什么區(qū)別呢

我們看源碼:

+ 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; } 

通過(guò)源碼中我們發(fā)現(xiàn),[className new]基本等同于[[className alloc] init];

區(qū)別只在于alloc分配內(nèi)存的時(shí)候使用了zone.

這個(gè)zone是個(gè)什么東東呢?

它是給對(duì)象分配內(nèi)存的時(shí)候,把關(guān)聯(lián)的對(duì)象分配到一個(gè)相鄰的內(nèi)存區(qū)域內(nèi),以便于調(diào)用時(shí)消耗很少的代價(jià),提升了程序處理速度;

3.而為什么不推薦使用new?

不知大家發(fā)現(xiàn)了沒(méi)有:如果使用new的話,初始化方法被固定死只能調(diào)用init.

而你想調(diào)用initXXX怎么辦?沒(méi)門(mén)兒!據(jù)說(shuō)最初的設(shè)計(jì)是完全借鑒Smalltalk語(yǔ)法來(lái)的。

傳說(shuō)那個(gè)時(shí)候已經(jīng)有allocFromZone:這個(gè)方法,

但是這個(gè)方法需要傳個(gè)參數(shù)id myCompanion = [[TheClass allocFromZone:[self zone]] init];

這個(gè)方法像下面這樣:

+ allocFromZone:(void *) z { return (*_zoneAlloc)((Class)self, 0, z); }  //后來(lái)簡(jiǎn)化為下面這個(gè): + alloc { return (*_zoneAlloc)((Class)self, 0, malloc_default_zone()); } 

但是,出現(xiàn)個(gè)問(wèn)題:這個(gè)方法只是給對(duì)象分配了內(nèi)存,并沒(méi)有初始化實(shí)例變量。

是不是又回到new那樣的處理方式:在方法內(nèi)部隱式調(diào)用init方法呢?

后來(lái)發(fā)現(xiàn)“顯示調(diào)用總比隱式調(diào)用要好”,所以后來(lái)就把兩個(gè)方法分開(kāi)了。

概括來(lái)說(shuō),new和alloc/init在功能上幾乎是一致的,分配內(nèi)存并完成初始化。

差別在于,采用new的方式只能采用默認(rèn)的init方法完成初始化,

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

感謝閱讀,希望能幫助到大家,謝謝大家對(duì)本站的支持!


注:相關(guān)教程知識(shí)閱讀請(qǐng)移步到IOS開(kāi)發(fā)頻道。
發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 江源县| 冕宁县| 万山特区| 辽阳市| 景洪市| 冷水江市| 五家渠市| 九寨沟县| 新闻| 那曲县| 兴化市| 土默特左旗| 纳雍县| 清涧县| 瑞丽市| 安顺市| 松江区| 逊克县| 阳城县| 兰坪| 马关县| 翁牛特旗| 大名县| 平湖市| 凤翔县| 喀什市| 慈溪市| 黔江区| 蒲城县| 肃南| 澄城县| 双峰县| 买车| 陆丰市| 云霄县| 黎平县| 新巴尔虎左旗| 武鸣县| 永清县| 沙洋县| 昭通市|