NSZone 和 allocWithZone

一個面試題:問alloc和allocWithZone是什么?有啥子區(qū)別?

+ (instancetype)allocWithZone:(struct _NSZone *)zone 
+ (instancetype)alloc

(以下是我自己看了少部分資料自己意淫想象,不算嚴謹?shù)恼_觀點,慎讀。)

首先alloc和allocWithZone都是創(chuàng)建一個對象實例
使用alloc方法創(chuàng)建一個類的實例的時候,其實最后還是會調(diào)用 allocWithZone 方法。在OC中allocWithZone這個方法應(yīng)該是棄用了的,只是由于歷史原因蘋果還保留著這個函數(shù)。

這個NSZone是個什么東西呢

據(jù)史料記載,NSZone是用來分配和管理一段內(nèi)存空間的一個結(jié)構(gòu)體。
然后我們查看NSZone的頭文件發(fā)現(xiàn)以下幾個函數(shù)

FOUNDATION_EXPORT NSZone *NSCreateZone(NSUInteger startSize, NSUInteger granularity, BOOL canFree) NS_SWIFT_UNAVAILABLE("Zone-based memory management is unavailable");

FOUNDATION_EXPORT NSString *NSZoneName(NSZone * __nullable zone) NS_SWIFT_UNAVAILABLE("Zone-based memory management is unavailable");
FOUNDATION_EXPORT NSZone * __nullable NSZoneFromPointer(void *ptr) NS_SWIFT_UNAVAILABLE("Zone-based memory management is unavailable");

FOUNDATION_EXPORT void *NSZoneMalloc(NSZone * __nullable zone, NSUInteger size) NS_SWIFT_UNAVAILABLE("Zone-based memory management is unavailable");
FOUNDATION_EXPORT void *NSZoneCalloc(NSZone * __nullable zone, NSUInteger numElems, NSUInteger byteSize) NS_SWIFT_UNAVAILABLE("Zone-based memory management is unavailable");
FOUNDATION_EXPORT void *NSZoneRealloc(NSZone * __nullable zone, void * __nullable ptr, NSUInteger size) NS_SWIFT_UNAVAILABLE("Zone-based memory management is unavailable");
FOUNDATION_EXPORT void NSZoneFree(NSZone * __nullable zone, void *ptr) NS_SWIFT_UNAVAILABLE("Zone-based memory management is unavailable");

看起來跟C語言的malloc,calloc,free等函數(shù)相似,所以大概NSZone就是可以分配一段連續(xù)空間。你可以將你創(chuàng)建的類實例都存在這個空間,自己管理。

比如你都用allocWithZone創(chuàng)建三個NSDictionary ,那這三個字典肯定是連在一起存儲的。然后你連著讀取三字典的數(shù)據(jù),地址相鄰理論上讀取速度更快。

反正當年肯定用這個有好處,現(xiàn)在蘋果都幫你處理好了,不用管了,官方也不建議再用這個接口了。

那么最后答案就是:
alloc和allocWithZone都是創(chuàng)建一個類實例的方法
不同之處在于,alloc無法指定一個NSZone來存儲自己創(chuàng)建的實例,它最終調(diào)用的是allocWithZone(nil),使用的是系統(tǒng)給定的NSZone
allocWithZone可以指定自己的NSZone來存儲自己創(chuàng)建的實例,如果zone傳nil 它使用的就是系統(tǒng)給定的NSZone

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容