我知道这可能是不好的做法,但我只是好奇这个是否有任何负面影响,在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?
}
这不会在编译器中发出警告,果然,我的代码正常工作。 如果没有负面的副作用,那么属性的类型,例如弱/强/分配等对这是否正常有影响?
注意:我知道在合成属性时这不起作用。
答案 0 :(得分:4)
这很好,是我个人喜欢的方法。生成编译器警告的原因是实例变量实际上名为_foo
。这是由编译器添加的自动合成完成的(它为您生成@synthesize foo = _foo
)。保持命名一致性有助于提高清晰度。
主要的潜在副作用是您无意中添加/无法添加self.
并最终尝试向nil
发送消息。
答案 1 :(得分:2)
首先:
当合成属性时,这将无效。
咦?为什么不呢?
实际上,从某种意义上来说它是“正常的”。实际上,当您使用self
关键字和点符号访问您的媒体资源时,没有任何歧义。但是,如果您的实例变量与您的局部变量具有相同的名称,则具有较窄范围的对象(在本例中为局部变量)会隐藏具有更宽范围的对象(ivar) )。这可能是不受欢迎的。据我所知,它甚至会导致编译器警告。此外,很难弄错并降低整体代码的可读性,所以如果你有相同名称的实例变量,不要这样做。
如果我没记错的话,最近版本的clang / LLVM工具链会自动为你合成属性,并且属性的支持ivar的名称前面有一个前导下划线,所以这应该不是问题。