2015-09-09 76 views
0

例如一個Person類有一個屬性@property (strong, nonatomic) NSString *name;和兩個方法:一個初始化方法- (instancetype)initWithName:(NSString *)name;而另一種方法- (void)doSomethingWithName:(NSString *)name;如下:傳遞屬性與本地變量作爲方法參數

- (instancetype)initWithName:(NSString *)name 
{ 
    self = [super init]; 
    if (self) { 
     self.name = name; 
     [self doSomethingWithName:name]; 
    } 
    return self; 
} 

- (void)doSomethingWithName:(NSString *)name 
{ 
    NSLog(@"My name is: %@", name) 
} 

而在這種情況下,我們傳遞的局部變量name- initWithName:- doSomethingWithName:,我們可以實現同樣的結果通過self.name- doSomethingWithName:。事實上,我們甚至可以重寫- doSomethingWithName:方法,例如:

- (void)doSomethingWithName 
{ 
    NSLog(@"My name is: %@", self.name) 
} 

哪些方法被認爲是最佳做法,爲什麼?

+1

(個人意見):我通常會建議將它作爲參數。這可讓您在課堂內外進行的任何更改中擁有更大的靈活性。 – Linuxios

回答

0

這兩種方法做不同的事情。

形式

- (void)doSomethingWithName:(NSString *)name 

更像是一個全球性的功能。它需要一個參數並用它做一些事情。

不帶參數的形式是實例方法。你要求一個對象用的名字來做一些事情,它的名字是

兩者都不如其他。這是一個需要/意圖的問題。

這就像問一位廚師:「有什麼更好,攪拌器還是鏟子?」兩者都不如其他。它們是適用於不同任務的不同工具。

0

這兩種方法都可能存在問題:在init方法中,您不應該使用訪問器或消息自我。

考慮一下,如果一些子類覆蓋訪問或doSomethingWithName會發生什麼。一個子類會期望一個完全初始化的對象,而現實是它的初始化方法尚未執行...