2012-11-29 98 views
3

在做我的項目時,我想知道是否應該通過viewcontrollers @synthezied屬性爲viewcontroller設置實例變量,或者創建一個新的init函數,當它調用init時設置實例變量。@property或init來設置實例變量

對我來說,似乎使用@properties設置實例變量更清潔。

您認爲如何?

我不使用筆尖或故事板...

+0

你不能決定哪個更清潔。語境或代表意義將決定。請參考@Wade的回答。 – 9dan

回答

2

合成只是保存你寫getter和setter方法的麻煩性。只使用@synthesize不會初始化您的屬性。你一定要初始化它們 - 在-init或聲明它們時。

+1

在過去,我曾經懶惰地實例化它們,所以如果我這樣做就不會有問題了:)我只是覺得初始化器的名字通常會變得非常難看。他們會像...... initwithbla bla1 bla2。如果你知道我的意思:) – WYS

2

我會去指定的初始化方法在設置實例變量,然後可以通過@synthesized屬性使用。初始化視圖控制器,然後設置其屬性使對象處於不一致的狀態。

指定初始化:

MyViewController * viewController = [[MyViewController alloc] initWithParam1:@"foo" param2:@5]; 
// now viewController is consistent as presumably it has all properties set 

通過setter方法設置屬性:

MyViewController * viewController = [[MyViewController alloc] init]; 
// here viewController is inconsistent as it does not have default properties set 
[viewController setParam1:@"foo"]; 
[viewController setParam2:@5]; 
// only here viewController is consistent and can be used normally 

根據實現您的initialisers您可以設置屬性的默認值,而不將它們作爲PARAMS到初始化器也一樣,所以我如果init默認將參數1設置爲@foo並將參數2設置爲@5,則第二個示例可能會出錯。

+0

這只是指定的初始化者永遠不會看起來太漂亮。看看我上面的評論:)但我明白你的意思:) – WYS

+0

你不會使用它們太多。如果您使用相同的參數很多次使用初始化程序 - 可能是在ViewController的類上創建靜態工廠方法是有意義的? – Eimantas

1

一般而言,您指定的初始化者應該只有參數是絕對必要的。任何可選的東西通常都會到別處,比如讀寫@property。這裏有一些餘地,根據你的判斷 - 有時候你會包含一個可選參數,因爲它實際上是絕大多數時間使用的(當它不是它有一個簡單的默認值,如零或0)。

想法是init方法返回的任何對象都應該以某種方式使用。需要額外的步驟來配置它幾乎總是暗示一個糟糕的設計。

遵循這一原則還鼓勵不變的情況下(因爲在許多情況下,你可以指定所有前期必要的參數),這是有很多原因有利 - 簡單性,可預測性,線程安全的,複製的,保留等,等等。

對於一個視圖控制器具體而言,通常你會有一個視圖被控制的初始化器,並將其他所有內容保留爲@properties。您的視圖控制器應該以某種身份,只使用視圖集;所有其他財產應該有合理的違約。