日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

malloc 初始化_你真的了解 NSObject 对象的初始化吗?

發(fā)布時(shí)間:2025/3/20 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 malloc 初始化_你真的了解 NSObject 对象的初始化吗? 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

在上一篇文章《利用__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)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。