2011-08-10 26 views
4

我真的很想做一些我可以在Java中做的事情,但无法找到如何在命名变量中使用objective-c。在java中:Objective c'this'等价于与方法参数同名的字段

private int var; 

public void aMethod(int var) 
{ 
    this.var = var; 
} 

我真的很想在某些情况下为方法参数和字段使用相同的变量名称。那可能吗?谢谢...

回答

8

考虑这个头文件:

@interface MYClass : NSObject { 
@private 
    int var;       // 1 
} 

@property(nonatomic, assign) int var; // 2 

-(void)someMethodWithVar:(int)var;  // 3 

@end 

在这种情况下,你有符号var的三个实例:

  1. 这是一个私有的实例变量,也叫做伊娃。
  2. 这是一个公共财产。
  3. 这是一个方法的参数。

由于所有三个实例是不同的东西var符号可以自由重用,他们不冲突。但是,在执行someMethodWithVar:时,您可能会遇到麻烦。

您可以分配属性:

-(void)someMethodWithVar:(int)var { 
    self.var = var; 
} 

这是可行的,但会给你警告“局部变量隐藏了实例变量”。它将按预期进行编译和工作。本地变量将有最高的主持人,但当地的伊娃不会解决,所以没问题。

您可以尝试伊娃直接分配:

-(void)someMethodWithVar:(int)var { 
    var = var; 
} 

仍然是同样的警告,但是这一次却是致命的!你所做的是将本地变量分配给自己,这是一个无操作。

你可以尝试参考以分配给伊娃self

-(void)someMethodWithVar:(int)var { 
    self->var = var; 
} 

仍然是一个警告,但因为你明确地通过self不是致命的取消引用伊娃。

现在的警告是坏的,你应该把警告视为错误,特别是如果你是新手而不是100%确定你做了什么。

有两种方法可以删除警告。我自己使用的第一种方法是始终使用_字符前缀来命名实例变量。这样他们就不会与任何东西发生冲突,而且它们非常明确。

@interface MYClass : NSObject { 
@private 
    int _var; 
} 
... 

第二种方法是更改​​参数名称。历史上许多苹果公司自己的方法都是通过使用aan作为前缀。

-(void)someMethodWithVar:(int)aVar; 
+0

我认为下划线前缀使事情非常干净 - 感谢您的建议! –

3

您可以使用:

[self setVar:var]; 

这对KVC影响虽然。看看the documentation

+1

事实上,你甚至可以用'self.var = VAR;'=) – elslooo

+0

我更喜欢其他的语法,因为它使得它清楚地表明它要调用一个方法。但它确实只是语法糖。 :) –

相关问题