是否可以使用与声明的属性同名的方法变量?

时间:2013-09-04 12:19:03

标签: objective-c variables properties

我知道这可能是不好的做法,但我只是好奇这个是否有任何负面影响,在Objective-C中(尽可能多地学习) :

@interface MyClass ()

// Declare a string called 'foo'

@property (nonatomic, strong) NSString *foo

@end

@implementation MyClass 

...

- (void)modifyFoo {

    // Create a local variable with the same name as a property

    NSString *foo = @"Hello!" // No compiler warnings?

    self.foo = foo; // <---- Is this OK?

}

这不会在编译器中发出警告,果然,我的代码正常工作。 如果没有负面的副作用,那么属性的类型,例如弱/强/分配等对这是否正常有影响?

注意:我知道在合成属性时这不起作用。

2 个答案:

答案 0 :(得分:4)

这很好,是我个人喜欢的方法。生成编译器警告的原因是实例变量实际上名为_foo。这是由编译器添加的自动合成完成的(它为您生成@synthesize foo = _foo)。保持命名一致性有助于提高清晰度。

主要的潜在副作用是您无意中添加/无法添加self.并最终尝试向nil发送消息。

答案 1 :(得分:2)

首先:

  

当合成属性时,这将无效。

咦?为什么不呢?


实际上,从某种意义上来说它是“正常的”。实际上,当您使用self关键字和点符号访问您的媒体资源时,没有任何歧义。但是,如果您的实例变量与您的局部变量具有相同的名称,则具有较窄范围的对象(在本例中为局部变量)会隐藏具有更宽范围的对象(ivar) )。这可能是不受欢迎的。据我所知,它甚至会导致编译器警告。此外,很难弄错并降低整体代码的可读性,所以如果你有相同名称的实例变量,不要这样做。

如果我没记错的话,最近版本的clang / LLVM工具链会自动为你合成属性,并且属性的支持ivar的名称前面有一个前导下划线,所以这应该不是问题。