@property和@synthesize以及内存错误

时间:2011-11-17 00:32:39

标签: objective-c cocos2d-iphone

我是Objective C和Cocos2D的初学者

我看了Features of use @property and @synthesize (cocos2d)

评论是对内存中的错误的引用。这些错误是什么?

在我的代码中我使用:

//interface
{
CC_bla_bla *a; 
}
@property(nonatomic, retain) CC_bla_bla *a;


//implementation
@synthesize a;

self.a=[CC_bla_bla load_value:123123]

//dealloc
[self.a release]
self.a = nil;

在课堂上,我总是使用self.a进行所有操作。那不好吗?

在什么意义上使用“实例变量”a?

3 个答案:

答案 0 :(得分:0)

属性最常用于从其他视图控制器获取内容。您可以仅在某个视图控制器中使用属性,但您必须谨慎。

既然你这样做:

@property(nonatomic, retain) CC_bla_bla *a;

保留计数为1,就像你一样,你必须在dealloc中释放它。但是你说你做了一个= [[CC alloc]等等......那么它的保留计数为2。

希望你理解这一点。当您需要使用属性时,您将自己意识到。

答案 1 :(得分:0)

属性只是将一些“元数据”与您的变量相关联,当您通过对象访问此变量时将使用这些变量。 @synthesize指令将使用属性config生成getter和变量的setter。

例如:

self.a = [CC_bla_bla load_value:123123]; // The object is retained because of the property

// This is equivalent to the previous line
[self setA:[CC_bla_bla load_value:123123]];

// ------
// By the same way
self.a;

// is equivalent to
[self a];

// ------
// method generated by your property
- (void)setA:(CC_bla_bla *)newA
{
    [newA retain];
    [a release];
    a = newA;
}

但是如果直接使用变量而不传递对象,则不使用属性值。例如:

a = [CC_bla_bla load_value:123123]; // The object is not retained so you may have unexcepted behaviors

// A good solution
a = [[CC_bla_bla load_value:123123] retain];

我希望它能帮助你澄清一些观点。如需进一步阅读,您可以观看tutorial

答案 2 :(得分:0)

我认为你的代码正确。 永远打电话给你的财产。很好。 但是,只有当[CC_bla_bla loadvalue:]不保留创建的对象时,您的代码才可以正常使用。如果你的loadvalue函数保留了创建的对象,并且属性会再次保留它,那么它应该被释放两次。