在哪里释放NSArray用于同一类的不同方法

时间:2013-03-14 06:17:55

标签: ios objective-c cocoa-touch

在我的iOS项目中,我创建的NSArray可以包含整数值。这个类中有几个函数可以在NSArray上执行任务。所以我想创建NSArray作为该类的私有属性。在viewDidLoad我正在为这个数组分配内存,即

myArray = [[NSArray alloc] init];

myArray将用于此类的多个方法中。当我分析我的代码时,它显示内存泄漏,因为我正在分配myArray而不是释放它。

如果我在[myArray release]dealloc警告中写viewDidUnload仍然存在。如果我在使用此数组的类的最后一个方法中释放myArray,xCode将不允许我这样做。

以下是我如何在课堂上宣布这一点 .h文件

@interface FightVC : UIViewController
{
    NSArray *myArray;
}

我想知道这可能是什么解决办法。然后使用autorelease。我不想把它公开,所以我不是把这个数组写成属性。

提前致谢

2 个答案:

答案 0 :(得分:2)

使用另一个答案中提到的私有@property可能是最好,最干净的方法。原始实例变量不是一种非常现代的做事方式。但是,如果你要沿着这条路前进,你可以为你的ivar实施一个吸气剂,在那里释放旧的ivar并保留新的ivar:

- (void)setMyArray:(NSArray *)array {
    [myArray release];
    myArray = [array retain];
}

这是典型的模式(这是@property自动为你做的事情。)

之后,您可以创建数组,使用setter,然后释放对象:

NSArray *newArray = [[NSArray alloc] init];
[self setMyArray:newArray];
[newArray release];

这应该让分析仪不会对你发出嘎嘎声。然而,有些事情对我有用:

1)[[NSArray alloc] init]不太可能做你想做的事。它将创建一个空的,不可变的数组。您可能要么需要NSMutableArray,要么想要使用不同的初始化程序对其中已有的对象进行实例化。

2)NSArray s不适合自己持有整数,它们持有对象。您可以使用NSPointerArray,也可以将整数放入NSNumbers并将其放入NSArray

答案 1 :(得分:0)

要将属性设为私有,您必须创建一个匿名类别。

在您的.m文件中:

@interface myClass ()

@property (nonatomic, retain) NSArray *myPrivateArray;

@end

@implementation myClass

// Class code here

@end

要释放数组,只需将属性设置为nil。

self.myPrivateArray = nil;