malloc 初始化_你真的了解 NSObject 对象的初始化吗?
在上一篇文章《利用__attribute__特性提高 APP 的魯棒性》中,提及了NS_DESIGNATED_INITIALIZER屬性。該屬性表示指定初始化方法,今天的主題就是聊一聊NSObject的初始化流程。
初始化分為兩步:
1. 分配內(nèi)存
2. 初始化對(duì)象的成員變量
分配內(nèi)存
如果有C語(yǔ)言開(kāi)發(fā)經(jīng)驗(yàn)的人,malloc之后,一般需要memset一下。但在Objective-C里面,可不是這樣的。
蘋(píng)果這段話表達(dá)了三個(gè)意思:
1. 開(kāi)辟一個(gè)內(nèi)存空間
2. isa變量和引用計(jì)數(shù)
3. 將所有的變量初始值置為0
初始化
從上面的描述中,僅僅alloc出來(lái)的對(duì)象還不能直接使用,還需要調(diào)用初始化函數(shù)。
以下是NSObject的初始化函數(shù)聲明:
而這里的init函數(shù)是NS_DESIGNATED_INITIALIZER的,也就是指定了初始化函數(shù)。
與指定初始化函數(shù)(designated initializer)對(duì)應(yīng)的是便利初始化函數(shù)(convenience initializers)
接下來(lái)分析一個(gè)具體的例子:
#import <Foundation/Foundation.h>這里聲明了一個(gè)指定初始化函數(shù)initWithCount和一個(gè)便利初始化函數(shù):initWithCount:year。
這里給出了三個(gè)警告,第一個(gè)警告表示父類(lèi)的指定初始化函數(shù)沒(méi)有找到。第二個(gè)和第三個(gè)警告表示不能直接調(diào)用父類(lèi)的初始化函數(shù)
解決方案如下:
從以上實(shí)現(xiàn)可以得出如下結(jié)論:
1. 如果子類(lèi)有指定初始化函數(shù),那么一定要實(shí)現(xiàn)所有父類(lèi)的指定初始化函數(shù),實(shí)現(xiàn)后的函數(shù)需調(diào)用本類(lèi)的指定初始化函數(shù)
規(guī)則解讀:P2PBomb需要實(shí)現(xiàn)父類(lèi)的init函數(shù),而且這里面必要還要調(diào)用[self initWithCount:0]
2. 如果子類(lèi)有指定初始化函數(shù),那么便利初始化函數(shù)必須調(diào)用自己的其它初始化函數(shù)(指定初始化函數(shù)或者其他便利初始化函數(shù)),不能調(diào)用super的初始化函數(shù)。
規(guī)則解讀:在便利初始化函數(shù)中調(diào)用[self initWithCount:0],如果在這里調(diào)用[super init]會(huì)存在告警
3. 如果子類(lèi)有指定初始化函數(shù),子類(lèi)指定初始化函數(shù)必須調(diào)用父類(lèi)的指定初始化函數(shù)
規(guī)則解讀:在指定初始化函數(shù)中,調(diào)用了[super init].
從以上規(guī)則,不難推導(dǎo)出另外一條規(guī)則,就是最終都要調(diào)用指定初始化函數(shù)。
再?gòu)奶O(píng)果官方提供的圖來(lái)理解一下這幾條規(guī)則:
使用場(chǎng)景
也許會(huì)有人說(shuō),這個(gè)東西在實(shí)際代碼中能用到嗎?貌試沒(méi)有用呢。OK,那我們舉一個(gè)使用場(chǎng)景:
使用場(chǎng)景:定義NS_DESIGNATED_INITIALIZER,大多是不想讓調(diào)用者調(diào)用父類(lèi)的初始化函數(shù),只希望通過(guò)該類(lèi)指定的初始化進(jìn)行初始化。
改進(jìn)優(yōu)化
如果父類(lèi)的指定初始化函數(shù)比較多,一一實(shí)現(xiàn)一把比較繁瑣,這時(shí)NS_UNAVAILABLE可以派上用場(chǎng)了。
#import <Foundation/Foundation.h>如果調(diào)用者使用init 初始化,編譯器就會(huì)給出一個(gè)編譯錯(cuò)誤。
使用NS_UNAVAILABLE后,就不需要在.m中重寫(xiě)父類(lèi)初始化函數(shù)了。如果要允許調(diào)用者使用init就需要在.m中重寫(xiě)父類(lèi)的初始化函數(shù),如最開(kāi)始提到的,否則就會(huì)報(bào)警告。注意,如果使用new來(lái)創(chuàng)建對(duì)象的話,即使init被聲明為NS_UNAVAILABLE,編譯器不會(huì)提示告警和錯(cuò)誤。
限制:
NS_DESIGNATED_INITIALIZER不能出現(xiàn)在Category中。
參考文獻(xiàn):
Object Allocation
Adopting Modern Objective-C
總結(jié)
以上是生活随笔為你收集整理的malloc 初始化_你真的了解 NSObject 对象的初始化吗?的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: mac查看图片分辨率_Mac图像检查工具
- 下一篇: vs 调试 无法加载自定义可视化工具_推