0

我知道这可能是不好的做法,但我只是好奇这在 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?

}

这不会在编译器中引发警告,果然,我的代码正常工作。如果负面影响为零,那么属性类型(例如弱/强/分配等)是否会影响这是否可行?

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

4

2 回答 2

4

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

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

于 2013-09-04T12:26:45.357 回答
2

首先:

当属性被合成时,这将不起作用。

嗯?为什么不?


实际上,在它起作用的意义上它是“好的”。self实际上,当您使用关键字和点符号来访问您的属性时,没有任何歧义。但是,如果您有一个与局部变量同名的实例变量,则具有较窄范围的对象(在本例中为局部变量)会隐藏具有较宽范围的对象(ivar)。这可能是不可取的。据我所知,它甚至会导致编译器警告。此外,很难弄错并降低整体代码的可读性,因此如果您有同名的实例变量,请不要这样做。

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

于 2013-09-04T12:27:26.000 回答