2015-09-09 50 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会发生什么。一个子类会期望一个完全初始化的对象,而现实是它的初始化方法尚未执行...