我对合成属性有点困惑。我有一个数组,我希望可以从其他类访问,所以这是我的代码:
MyClass.h
@interface MyClass : CCLayer {
NSMutableArray *myArray;
}
@property (nonatomic, retain) NSMutableArray *myArray;
MyClass.m
@synthesize myArray;
-(id)init
{
myArray = [[NSMutableArray alloc] init];
}
-(void)dealloc
{
[myArray release];
myArray = nil;
}
我现在有点困惑..我的阵容和self.myArray一样吗?我是否还必须发布self.myArray?感谢。
答案 0 :(得分:2)
您将自己的财产声明为保留,这意味着如果您设置使用self.myArray
,它将自动保留。因此,您只需在init
方法中创建自动释放的数组,并将其设置为
myArray = [NSMutableArray array];
self.myArray = myArray;
在这种情况下,您不必在dealloc
方法或其他任何方法中释放它。正如dasblinkenlight所说,如果您想确保@synthesize
与您的self.myArray
实例相关联,则必须使用myArray
。
答案 1 :(得分:1)
假设您的@synthesize
指令看起来像这样
@synthesize myArray;
除了您正在做的事情之外,您不需要做任何事情:您的属性将其值存储在同名的实例变量中。
已编辑:删除了建议在self.myArray
方法中设置dealloc
的替代方案。
答案 2 :(得分:0)
是的,最好的方法是设置属性nil并释放变量。
-(void)dealloc{
self.myArray = nil;
[myArray release];
[super dealloc];
}
答案 3 :(得分:0)
您提供的代码并不正确。
不,访问属性并访问字段本身并不相同。
我的猜测是你正在查看旧的obj C示例,其中需要使用属性创建字段。
您的代码中也没有@synthesize指令。
在当前的obj C代码中,不需要声明一个字段来支持该属性,字段以及getter和setter将由你自动合成(由编译器生成)。
默认字段生成是您的属性的名称,前面有下划线。
当您通过_myArray直接访问该字段时,您将绕过生成的getter / setter中包含的任何保留或释放代码,并且必须手动管理非ARC项目中的内存。
总而言之,你不需要你的字段定义,你也不需要合成指令。
您可以使用_myArray直接访问您的字段,或通过self.myArray
访问该字段它们不是一回事,人们通过生成的代码来遵守你的属性定义,直接保留,分配,复制和访问字段,直接绕过这些语义。
如果您将属性定义为retain,则需要在dealloc
中释放它您可以使用
self.myArray = nil;
将处理发布或
[_myArray release];
_myArray = nil;
虽然上一篇文章中有人说在dealloc中将属性设置为nil可能会导致问题我从未见过它实际发生在我的应用程序中,ymmv
答案 4 :(得分:0)
回答你的问题:
我现在有点困惑..我的阵容和self.myArray一样吗?
是的,但没有。两者都指向同一个对象,内存中的区域相同。如果您阅读myArray或self.myArray,则它们的行为相同,而不是self.myArray的消息发送开销。
但是,如果您指定给myArray,则不会保留该对象。只有在分配给self.myArray时才会保留它。
我是否还必须发布self.myArray?
没有
您也可以选择释放或将属性设置为nil。只要属性是@ synthesize'd,两个例子都做同样的事情:
-(void) dealloc
{
[super dealloc];
[myArray release];
}
-(void) dealloc
{
[super dealloc];
self.myArray = nil;
}
请在此处查看discussion of the pros/cons to each approach。
从这个问题我认为你是应该真正使用ARC的开发人员。你将获得更少的学习和更少的技术问题。我不能低估这些日子使用ARC的重要性,特别是如果你没有太多的ObjC经验。阅读此how to enable ARC for cocos2d或仅使用Kobold2D即可使用支持ARC的cocos2d开箱即用。