2011-11-17 54 views
0

我的目标C初学者和Cocos2d@property和@synthesize和内存错误

我读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?

+0

千万不要'[self.a release]'! 'self.a = nil'释放'a',因此你已经释放了'a',你可能会在某个时候崩溃。 – hypercrypt

回答

0

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

既然你做的事:

@property(nonatomic, retain) CC_bla_bla *a; 

这有一个1保留计数这是你一个人,你必须在dealloc中释放出来。但是,假设你做一个= [[CC分配],等等....那么它将有一个保留计数两个。

希望你明白这一点。当你需要使用属性的时候,你会自己实现。

0

属性只是用来将一些“元数据”关联到您通过对象访问此对象时将使用的变量。 @synthesize指令将使用properties 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

0

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

相关问题