使用(或不使用)自我。在Objective-C属性中

时间:2012-04-12 21:13:22

标签: objective-c syntax self

我对在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值的方法

那么......使用自我还是不使用自我之间的差异是什么?我的意思是,很明显我要使用它,因为如果不是它会导致问题,但我不知道为什么

提前谢谢

3 个答案:

答案 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

但最好坚持点语法。