目标c内存泄漏与阵列?

时间:2011-05-31 13:15:56

标签: objective-c memory-leaks

在我的应用程序中,我声明了一个数组属性,

@property (nonatomic, retain) NSArray *listOfItems;

在我的viewDidLoad方法中,

listOfItems = [[NSArray alloc] initWithObjects:@"First", @"Second", nil];

我没有在我的viewDidLoad中释放数组,因为数组中的对象将在应用程序的其他地方被要求。
最后在我的dealloc方法中,我把,

[listOfItems release];

我的问题是:此代码中是否存在内存泄漏?由于属性中的(retain)以及viewDidLoad中的alloc,保留计数应该增加两次,但在dealloc方法中只减少一次。

6 个答案:

答案 0 :(得分:1)

保留只会在你这样做时“开始”

self.listOfItems = [[NSArray alloc] initWithObjects:...];

现在,保留计数确实是2.如果你把自己留出来,那就只有一个。调用'set'和只是分配有明显的区别。

回答你原来的问题;你的代码没有泄露。

答案 1 :(得分:0)

由于你的setter保留了数组,你必须在你的viewDidLoad方法中分配并设置它之后释放它(用这种表示法我建议“autorelease”)。

但是如果你使用[NSArray arrayWitObjects:],也许对你来说更容易。

答案 2 :(得分:0)

NSArray *array=[[NSArray alloc] initWithObjects:@"First",@"Second",nil];
self.listOfItems=array;
[array release];

你也可以这样使用。

答案 3 :(得分:0)

就像@MiRAGe说的那样,

listOfItems = [[NSArray alloc] initWithObjects:@"First", @"Second", nil];

保留计数为1

但如果代码是

self.listOfItems = [[NSArray alloc] initWithObjects:@"First", @"Second", nil];

保留计数为2

答案 4 :(得分:0)

是的,有潜在的泄漏。考虑:

  1. 在-viewDidLoad中,您按照自己的描述设置了listOfItems。
  2. 随后,其他一些代码会调用yourObject.listOfItems = someNewList;
  3. 你的-dealloc发布了listOfItems。
  4. 我意识到上面的#2可能不会在您的代码中发生,但是从现在起一个月后您可能会因某种原因决定需要更新列表并引入此问题。想想如果#2曾经发生过会发生什么......

    • 你的listOfItems ivar突然指出 到另一个清单。
    • 您不再具有对旧列表的引用,因此永远不会发布它。那是你的泄密。

    在将数组分配给您的属性后,在-viewDidLoad中释放数组要好得多。

答案 5 :(得分:0)

如果你像这样练习,它不会让人感到困惑

@property (nonatomic, retain) NSArray *listOfItems;  
NSArray *temparray = [[NSArray alloc] initWithObjects:@"First", @"Second", nil];  
self.listOfItems = temparray;  
[temparray release];

和dealloc

[listOfItems release];