1

我对合成属性有点困惑。我有一个数组,我希望可以从其他类访问,所以这是我的代码:

我的类.h

@interface MyClass : CCLayer {
    NSMutableArray *myArray;
}

@property (nonatomic, retain) NSMutableArray *myArray;

我的班级.m

@synthesize myArray;

-(id)init
{
    myArray = [[NSMutableArray alloc] init];
}

-(void)dealloc
{
    [myArray release];
    myArray = nil;
}

我现在有点困惑..myArray 和 self.myArray 一样吗?我也必须释放 self.myArray 吗?谢谢。

4

5 回答 5

2

您将您的属性声明为保留,这意味着如果您设置为 using ,它将自动保留self.myArray。因此,您可以简单地在您的方法中创建自动释放数组init并将其设置为

myArray = [NSMutableArray array];
self.myArray = myArray;

在这种情况下,您不必在dealloc方法或其他任何内容中释放它。正如 dasblinkenlight 所说,@synthesize如果您想确保它self.myArray与您的myArray实例相关联,则必须使用它。

于 2012-10-17T09:32:56.910 回答
1

假设您的@synthesize指令看起来像这样

@synthesize myArray;

除了已经在做的事情之外,您不需要做任何事情:您的属性将其值存储在同名的实例变量中。

已编辑:删除了建议self.myArraydealloc方法中设置的替代方案。

于 2012-10-17T09:29:04.547 回答
0

您提供的代码并不正确。

不,访问属性和访问字段本身是不一样的。

我的猜测是您正在查看旧的 obj C 示例,其中有必要使用该属性创建字段。

您的代码中也没有 @synthesize 指令。

在当前的 obj C 代码中,不需要声明一个字段来支持属性,该字段以及 getter 和 setter 将为您自动合成(由编译器生成)。

默认字段生成是您的属性的名称,其前面带有下划线。

当您通过 _myArray 直接访问该字段时,您将绕过生成的 getter/setter 中包含的任何保留或释放代码,并且必须手动管理非 ARC 项目中的内存。

总而言之,您不需要字段定义,也不需要综合指令。

您可以使用 _myArray 直接访问您的字段,或者通过 self.myArray 访问该属性

它们不是一回事,通过生成的代码遵循您的属性定义,因为保留、分配、复制和访问字段直接完全绕过了这些语义。

如果您将属性定义为保留,则需要在 dealloc 中释放它

你可以使用

self.myArray = nil;

这将处理释放或

[_myArray release];
_myArray = nil;

尽管在之前的帖子中有人说在 dealloc 中将属性设置为 nil 可能会导致一个问题,但我从未见过它在我的应用程序中实际发生过,ymmv

于 2012-10-17T10:08:59.947 回答
0

是的,最好的方法是设置属性 nil 并释放变量。

-(void)dealloc{
    self.myArray = nil;
    [myArray release];

    [super dealloc];
}
于 2012-10-17T09:28:01.183 回答
0

要回答您的问题:

我现在有点困惑..myArray 和 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;
}

有关每种方法的优缺点的讨论,请参见此处。

从这个问题来看,我认为您是真正应该使用 ARC 的开发人员。您将需要学习的东西更少,未来的技术问题也会更少。我不能低估这些天使用 ARC 的重要性,特别是如果你没有太多的 ObjC 经验。阅读这篇如何为 cocos2d 启用 ARC或仅使用Kobold2D以便能够与开箱即用的启用 ARC 的 cocos2d 一起工作。

于 2012-10-17T13:44:28.270 回答