![](/img/trans.png)
[英]if (self = [super init]) vs. if ((self = [super init]))
[英]Can anyone give me an easy explanation about “self=super init”?
我仍然不了解self = super init; ,盡管我讀了很多書和谷歌。 我知道它用於檢查當前對象是否等於父類等的返回對象。但是,我不能接受這就是答案。 有人可以給我一個簡單但可靠的答案嗎? 謝謝!
快速的答案是,您正在告訴您的類的超類初始化該對象。 因為您是從該超類繼承的,所以您可以執行特定於實現的其他初始化任務,但是首先必須確保執行了初始化的基礎(由基類NSObject處理)。 從另一個類擴展(繼承)的每個類都必須先確保其父類已被初始化,然后才能進行初始化。
一個非常快速組成的(因此可能很差)的類似物-在創建您的父母之前,必須先創建您的父母(超類),並且他們必須首先創建父母(他們的超類)
我建議您搜索面向對象的編程基礎知識,以了解這種情況。
您提到“檢查”使我認為您將=
視為比較操作。 不是。 這是一項任務。 有時,分配出現在if
條件中。 這利用了賦值表達式具有一個值的事實-被賦值。 因此, if (self = [super init])
組合了“調用super的-init
方法”,“將結果分配給self
” 和 “檢查我們是否從super的-init
得到非零”(也就是說,那個super沒有?無法初始化)。
由於這種組合的分配和測試可能會造成混淆並且容易出錯,因此Apple現在建議將分配與檢查失敗分開:
self = [super init];
if (self)
// ... continue initializing ...
NSObject是根類。 https://developer.apple.com/library/ios/#documentation/Cocoa/Reference/Foundation/Classes/nsobject_Class/Reference/Reference.html您可以在此處找到init
方法。 NSObject
類中的init
方法是Objective-C中每個對象的初始化程序。 super
僅返回對象的超類。
如果Class B
是從Class A
Class A
繼承的,則Class A
Class A
將是Class B
類的超類。 再次另一類Class C
,將其從繼承Class B
,超類的Class C
將是Class B
。 等等。
當您調用[super init];
從一個類中,它僅調用init
類的init
方法,而后者又調用init
類的init
方法,依此類推。 最后,它將到達根對象NSObject,並調用實際的init
方法。 到那時,iOS將為您的對象分配內存,並為您的對象分配必要的數據結構。 閱讀有關NSObject類中每個方法和屬性的文檔。
如果創建了MyView
類,它是UIView
子類,則您的類層次結構將是。
NSObject
UIAppearanceContainer
UIAppearance
NSCoding
UIView
MyView
因此,當您在類“ MyView”中調用init
方法時,它將調用
UIView的init方法
UIView將調用NSCoding的init方法
NSCoding將調用UIAppearance的init方法
UIAppearance將調用UIAppearanceContainer的init方法
UIAppearanceContainer將調用NSObject的init方法。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.