在做我的項目時,我想知道是否應該通過viewcontrollers @synthezied屬性爲viewcontroller設置實例變量,或者創建一個新的init函數,當它調用init時設置實例變量。@property或init來設置實例變量
對我來說,似乎使用@properties設置實例變量更清潔。
您認爲如何?
我不使用筆尖或故事板...
在做我的項目時,我想知道是否應該通過viewcontrollers @synthezied屬性爲viewcontroller設置實例變量,或者創建一個新的init函數,當它調用init時設置實例變量。@property或init來設置實例變量
對我來說,似乎使用@properties設置實例變量更清潔。
您認爲如何?
我不使用筆尖或故事板...
合成只是保存你寫getter和setter方法的麻煩性。只使用@synthesize
不會初始化您的屬性。你一定要初始化它們 - 在-init
或聲明它們時。
在過去,我曾經懶惰地實例化它們,所以如果我這樣做就不會有問題了:)我只是覺得初始化器的名字通常會變得非常難看。他們會像...... initwithbla bla1 bla2。如果你知道我的意思:) – WYS
我會去指定的初始化方法在設置實例變量,然後可以通過@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
,則第二個示例可能會出錯。
一般而言,您指定的初始化者應該只有參數是絕對必要的。任何可選的東西通常都會到別處,比如讀寫@property。這裏有一些餘地,根據你的判斷 - 有時候你會包含一個可選參數,因爲它實際上是絕大多數時間使用的(當它不是它有一個簡單的默認值,如零或0)。
想法是init方法返回的任何對象都應該以某種方式使用。需要額外的步驟來配置它幾乎總是暗示一個糟糕的設計。
遵循這一原則還鼓勵不變的情況下(因爲在許多情況下,你可以指定所有前期必要的參數),這是有很多原因有利 - 簡單性,可預測性,線程安全的,複製的,保留等,等等。
對於一個視圖控制器具體而言,通常你會有一個視圖被控制的初始化器,並將其他所有內容保留爲@properties。您的視圖控制器應該以某種身份,只使用視圖集;所有其他財產應該有合理的違約。
你不能決定哪個更清潔。語境或代表意義將決定。請參考@Wade的回答。 – 9dan