1

我对在 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 = [方法:val];// 一些返回 MyOtherClass 值的方法

为了

自我.myVar = [方法:val];// 一些返回 MyOtherClass 值的方法

那么......使用 self 或不使用它有什么区别?我的意思是,很明显我必须使用它,因为如果不使用它会导致问题,但我不知道为什么

先感谢您

4

3 回答 3

3

如果您使用 self,则您正在使用该属性,并且它标有“保留”。如果您使用该变量,您将绕过该属性,因此没有“保留”。您可以编写myVar = [[someObject method:val] retain];并获得与属性相同的效果。

于 2012-04-12T21:18:38.793 回答
1

这是一个很好的例子,说明了为什么你应该改变你的@synthesizeto@synthesize myVar = _myVar;或一些变体。如果不这样做,可以从您下面设置您的实例变量,因为直接分配“myVar = nil”会绕过您的设置器。

myVar = _myVar如果您尝试这样做,使用该策略将导致编译器抱怨,myVar =并要求您调用self.myVar哪个将访问您的 setter 或 getter。

然后,您应该使用的唯一地方_myVar是,如果您更改了该变量的 setter 或 getter 的声明。

于 2012-04-12T21:19:42.663 回答
0

你在调用什么方法val

我想当你这样做的时候

myVar = [method:val]; // Some method that returns a MyOtherClass value

结果是一个自动释放的对象。这意味着当您的 init 方法完成时,您的myVar对象将被释放并被销毁。该myVar变量仍然指向内存中对象所在的位置,但该内存可能会被任何东西填充。

当您使用像这样使用点语法的属性设置器方法时

self.myVar = [method:val];

编译器自动为您合成的 setter 方法将向对象发送一条保留消息以保留它。

您还可以像这样修复代码错误:

myVar = [[method:val] retain]; // Some method that returns a MyOtherClass value

但最好坚持点语法。

于 2012-04-12T21:21:17.350 回答