Objective c'this'等效于与方法参数同名的字段

Deb*_*hat 4 java objective-c

我真的想做一些我可以用Java做的事情,但是无法找到有关命名变量的Objective-c方法.在java中:

private int var;

public void aMethod(int var)
{
    this.var = var;
}
Run Code Online (Sandbox Code Playgroud)

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

Pey*_*loW 8

考虑这个头文件:

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

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

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

@end
Run Code Online (Sandbox Code Playgroud)

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

  1. 这是一个私有实例变量,也称为ivar.
  2. 这是一个公共财产.
  3. 这是方法的一个参数.

由于所有三个实例都是不同的东西,var符号可以自由重用,它们不会发生冲突.但是在实施时someMethodWithVar:你可能遇到麻烦.

您可以分配属性:

-(void)someMethodWithVar:(int)var {
    self.var = var;
}
Run Code Online (Sandbox Code Playgroud)

这将工作,但会给你警告"局部变量隐藏实例变量".它将按预期编译和工作.本地变量将拥有最高的总数,但当地的ivar永远不会解决,所以没问题.

您可以尝试直接分配ivar:

-(void)someMethodWithVar:(int)var {
    var = var;
}
Run Code Online (Sandbox Code Playgroud)

仍然是相同的警告,但这次是致命的!你所做的是将局部变量分配给自己,一个无操作.

您可以尝试通过引用分配ivar self:

-(void)someMethodWithVar:(int)var {
    self->var = var;
}
Run Code Online (Sandbox Code Playgroud)

仍然是一个警告,但不是致命的,因为你明确地解除了对伊瓦的影响self.

现在警告很糟糕,你应该把警告视为错误,特别是如果你是新手并且不是100%确定你做了什么.

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

@interface MYClass : NSObject {
@private
   int _var;
}
...
Run Code Online (Sandbox Code Playgroud)

第二种方法是更改​​参数名称.Apple历史上许多方法都是通过使用aan作为前缀来实现的.

-(void)someMethodWithVar:(int)aVar;
Run Code Online (Sandbox Code Playgroud)