2012-02-13 30 views
3

在嘗試以前我單身基於全局控制器類轉換爲通過所需的方法從一個對象到另一個需要他們更多的OOP友好的依賴注入方法的過程。我碰到的地方我以前的類其init過程中使用的全局對象的問題。所需參數在Objective-C的構造

(id)init 
{ 
    self = [super init]; 
    if (self) 
    { 
     [self setUpPhysicsWithWorld:FMPresenter.physics.world]; 
    } 
    return self; 
} 

其中FMPresenter.physics返回一個單體物理對象。因爲我的對象不能正確地沒有物理對象實例化,以init呼叫無效。我看到這個被使用:

(id) init 
{ 
    NSAssert(NO, @"init not allowed"); 
    [self release]; 
    return nil; 
} 

(id) initWithPhysics:(FMPhysics*)physics 
{ 
    self = [super init]; 
    if (self) { 
     [self setUpPhysicsWithWorld:physics.world]; 
    } 
    return self; 
} 

這是在Objective-C中執行構造函數參數的首選方法嗎?

回答

5

是的,你的解決方案是正確的,首選的方法是創建另一個方法,以init開始,並且在調用super之後向其傳遞所需的初始化參數並返回self。

+0

謝謝,我不太確定,因爲我想起了Java的沒讓你調用基類的構造除非您指定,或者根本沒有指定任何構造函數。 – 2012-02-13 12:54:06

1

如果它們可能是一個默認的FMPhysics對象(不熟悉它),那麼另一個選項是init調用具有默認物理世界的initWithPhysics。

例如,下面是一個使用db包裝的init重載,其中默認的init創建一個內存數據庫,這是一個很好的默認值。

- (id)init 
{ 
    sqlite3 *db; 
    sqlite3_open(":memory:", &db); 
    return [self initWithDatabase:db]; 
} 

- (id)initWithDatabase:(sqlite3*)database 
{ 
    self = [super init]; 
    if (self) 
    { 
     _sqlite3 = database;  
    } 

    return self; 
} 
+0

我想用[共享[FMPhysics]''但我是這樣想遠離移動:P – 2012-02-13 12:55:04

+0

歡呼的例子 – 2012-02-13 12:55:50