我对在Objective-C中为属性赋值有疑问。我有很多“遗漏错误”的问题,例如,如果我有这个界面:
// MyClass.h
@interface MyClass : NSObject {
MyOtherClass *myVar;
}
@property (nonatomic, retain) MyOtherClass *myVar;
- (id)initWithValue:(NSString *)val;
这个实施:
// MyClass.m
@implementation MyClass
@synthesize myVar;
- (id)initWithValue:(NSString *)val {
self = [super init];
if (self != nil) {
/** Do some stuff with val... **/
myVar = [method:val]; // Some method that returns a MyOtherClass value
}
return self;
}
在执行的某个时刻,myVar的值会消失,发生变化或其他...而且解决方案是改变:
myVar = [method:val]; //一些返回MyOtherClass值的方法
的
self .myVar = [method:val]; //一些返回MyOtherClass值的方法
那么......使用自我还是不使用自我之间的差异是什么?我的意思是,很明显我要使用它,因为如果不是它会导致问题,但我不知道为什么
提前谢谢
答案 0 :(得分:3)
如果您使用self,则表示您正在使用该属性,并标记为“retain”。如果您使用该变量,则绕过该属性,因此不会“保留”。您可以编写myVar = [[someObject method:val] retain];
并获得与该属性相同的效果。
答案 1 :(得分:1)
这是一个很好的示例,说明为什么要将@synthesize
更改为@synthesize myVar = _myVar;
或其中的一些变体。如果不这样做,就可以将你的实例变量从你的下面设置为`myVar = nil"会绕过你的二传手。
使用myVar = _myVar
策略会导致编译器在您尝试执行myVar =
时抱怨并要求您拨打self.myVar
来访问您的设置者或获取者。
您应该使用_myVar
的唯一地方是您更改该变量的setter或getter的声明。
答案 2 :(得分:0)
您在val
上调用了哪种方法?
我想你做的时候
myVar = [method:val]; // Some method that returns a MyOtherClass value
结果是一个自动释放的对象。这意味着当你的init方法完成时,你的myVar
对象被释放并被销毁。 myVar
变量仍指向内存中对象所在的位置,但该内存可能会被任何内容填充。
使用像这样的点语法使用属性setter方法时
self.myVar = [method:val];
编译器自动为您合成的setter方法将向对象发送一条保留消息以保持它。
你也可以修复你的代码错误:
myVar = [[method:val] retain]; // Some method that returns a MyOtherClass value
但最好坚持点语法。