2012-08-01 53 views
4

在Cocoa中總是調用一個方法嗎?許多職業有initinitWith,但更糟的是他們可以從筆尖或其他東西加載。我不想在這種情況下刮擦,發現它是如何做到這一點的。我只是想設置一些初始變量和其他的東西,我想一個方法子類,我可以依靠不管它是一個UIViewUIViewControllerUITableViewCell在iOS中是否有始終調用的init方法?

回答

8

沒有沒有這樣的方法。 init來自NSObject所以每個對象都可以使用它,以及子類定義它們自己的初始化方法。例如,UIView定義爲initWithFrame:並且此外存在來自協議的初始方法,例如NSCoding,其定義爲initWithCoder:。這是Objective-C的動態特性,任何事情都可以隨時擴展。這就是說,有一些模式。幾乎總是需要initWithNibName:bundle:UIView幾乎總是需要initWithFrame:initWithCoder:。我所做的是做一個內部初始化方法,並讓其他人調用它。

- (void)initialize 
{ 
    //Do stuff 
} 

- (id)initWithFrame:(CGRect)frame 
{ 
    self = [super initWithFrame:frame]; 
    if(self) 
    { 
     [self initialize]; 
    } 
} 

- (id)initWithCoder:(NSCoder *)aCoder 
{ 
    self = [super initWithCoder:aCoder]; 
    if(self) 
    { 
     [self initialize]; 
    } 
} 
+0

我喜歡那個解決方案,所以它至少將它從特定的init方法中移除。我希望有一個通用的初始化,所有的入口都叫我可以使用。沒有這樣的運氣!謝謝。 cocos2d非常容易,因爲所有的init方法總是最終調用init,所以你可以確定你會得到它。這是你真正感激的東西。否則,你犯了錯誤的分配變量或做永遠不會發生的調用,你嘗試和調試...反正,我會停下來,所以我不會開始哭泣。 – napierzaza 2012-08-01 12:02:30

+0

@borrrden抱歉,是不是**初始化**每個班都調用一次? – onmyway133 2013-11-14 03:43:38

+1

@entropy是的,有一種稱爲初始化的方法,每次運行每個類調用一次,但它是一個類方法(而不是實例方法),所以這不會導致任何問題。不過,真的,你可以將它命名爲任何你想要的。我發現在末尾添加類名可防止子類意外覆蓋它。 – borrrden 2013-11-14 03:51:52

-1

有許多方法可以編寫自定義初始化程序。

- (id)initWithString:(NSString *)string { 
    if((self == [super init])) { 
     self.string = string; 
    } 
    return self; 
} 

這就是我如何寫一般化的初始值設定項。例如,上面的那個接受一個字符串。 (如果你不想要,你不必傳遞字符串)。

順便說一句,init是一種方法。根據NSObject的頭文件,init有一個方法實現。

+0

-1這似乎沒有試圖回答這個問題。@napierzaza不問如何編寫自定義的初始化程序,他們正在尋找一個初始化方法,最終由每個對象調用,而不管類如何,以便在初始化時覆蓋它並提供默認實例變量等。 – Stuart 2014-05-13 07:00:12

+0

我不認爲這是一個初始化工具。 – rightaway717 2014-11-24 05:22:30

0

不是100%確定它始終被調用,但我確信這是一個可行的選項。坦率地說,我不記得我曾經見過這種方法在實踐中使用,我通常回避使用這種方法(我完全不知道爲什麼,可能是因爲它不是最乾淨和最全面的方法來實現此...):

-didMoveToSuperview() 

從技術文檔:

告訴那它的父改變了看法。 此方法的默認實現不執行任何操作。只要超級視圖改變,子類就可以覆蓋它以執行其他操作。

相關問題