区分iVar和方法参数?

时间:2011-09-16 15:32:40

标签: objective-c

我有这样的房产:

@property (nonatomic, strong) IBOutlet UIImageView *backgroundImageHolder;

我想调整setter,XCode会填写方法签名,如下所示:

-(void)setBackgroundImageHolder:(UIImageView *)backgroundImageHolder {

但是,要在方法中实际执行任何操作,我必须将参数backgroundImageHolder更改为backgroundImageHolderIn之类的内容。有什么方法可以避免这种情况吗?有没有办法设置iVar而不重新调用setter(导致无限循环),或者再次引用参数?

我刚试过:

self->backgroundImageHolder = backgroundImageHolder;

但编译器仍然警告我。

注意:我正在使用编译器为该属性自动生成的iVar,但默认情况下它的名称是相同的。

4 个答案:

答案 0 :(得分:1)

您可以告诉编译器如何命名生成的ivar:

@synthesize propertyName = iVarName;

如果确实存在名为iVarName的ivar,则使用其中一个。如果它不存在,编译器会为您创建它。

像:

@synthesize backgroundImageHolder = myBackgroundImageHolder;

现在您可以访问实例变量myBackgroundImageHolder。您不需要先在界面中声明它。

答案 1 :(得分:1)

好吧,冲突的参数名称似乎已经很好地涵盖了。基本上,你必须:

  • 重命名传入的参数
  • 重命名合成的iVar

一旦你的方法参数与你试图设置的iVar不同,你就拥有编写自定义setter所需的一切。要避免无限循环,您必须不要调用当前正在实现的setter,无论是通过点语法还是方法大括号语法。相反,请直接参考支持iVar。您需要注意手动实现您在属性中声明的内存管理语义(assign vs. retain等):

// Backed by _myProperty iVar.
- (void)setMyProperty:(NSInteger)myProperty {

    // Insert custom code here...

    [self setMyProperty:myProperty]; // Obviously bad.

    self.myProperty = myProperty;    // Less obviously bad (thanks dot syntax)
                                     // but semantically identical to the previous line.

    _myProperty = myProperty         // Good, (assuming assign semantics).
}

答案 2 :(得分:0)

编译器会向您发出警告,因为当您声明@property时,它会创建与属性具有完全相同名称的实例变量(以及作为setter方法的参数)。避免它的一种方法是创建不同命名的实例变量,然后使用@synthesize将其与属性配对,如下所示:

// .h
@interface Foo : NSObject {
    IBOutlet UIImageView *myfooImageView;
}

@property (nonatomic, retain) UIImageView *publicFooImageView;

// .m
@implementation Foo
@synthesize publicFooImageView=myfooImageView;
@end

答案 3 :(得分:0)

最明确的事情是:

在标题中,为backgroundImageHolder定义一个iVar,如此

@interface Something : NSObject
{
  IBOutlet UIImageView *_backgroundImageHolder
}

注意前导下划线。

然后在你的.m文件中,使用如下的合成调用:

@synthesize backgroundImageHolder=_backgroundImageHolder;

或者自己定义getter和setter方法:然后你可以通过“_backgroundImageHolder”访问ivar,而不会再有意外调用setter的危险。