我有这样的房产:
@property (nonatomic, strong) IBOutlet UIImageView *backgroundImageHolder;
我想调整setter,XCode会填写方法签名,如下所示:
-(void)setBackgroundImageHolder:(UIImageView *)backgroundImageHolder {
但是,要在方法中实际执行任何操作,我必须将参数backgroundImageHolder
更改为backgroundImageHolderIn
之类的内容。有什么方法可以避免这种情况吗?有没有办法设置iVar而不重新调用setter(导致无限循环),或者再次引用参数?
我刚试过:
self->backgroundImageHolder = backgroundImageHolder;
但编译器仍然警告我。
注意:我正在使用编译器为该属性自动生成的iVar,但默认情况下它的名称是相同的。
答案 0 :(得分:1)
您可以告诉编译器如何命名生成的ivar:
@synthesize propertyName = iVarName;
如果确实存在名为iVarName
的ivar,则使用其中一个。如果它不存在,编译器会为您创建它。
像:
@synthesize backgroundImageHolder = myBackgroundImageHolder;
现在您可以访问实例变量myBackgroundImageHolder
。您不需要先在界面中声明它。
答案 1 :(得分:1)
好吧,冲突的参数名称似乎已经很好地涵盖了。基本上,你必须:
一旦你的方法参数与你试图设置的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的危险。