首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >NSMutableArray销毁

NSMutableArray销毁
EN

Stack Overflow用户
提问于 2008-10-07 18:05:05
回答 5查看 19.9K关注 0票数 14

我有一个包含快乐对象的数组NSMutableArray。每当我试图清除所有对象的数组并重新填充它时,这些对象就会恶意地启动(泄漏)我。

它在init函数中分配,如下所示

代码语言:javascript
复制
self.list = [NSMutableArray array];

我用来清除它的不同方法包括:

代码语言:javascript
复制
self.list = nil;
self.list = [NSMutableArray array];

代码语言:javascript
复制
[self.eventList removeAllObjects];

显式分配和释放数组也不起作用。仅当我尝试重置列表时才会发生泄漏。

我是在重置时遗漏了一个步骤,还是这是一个不同的问题?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2008-10-10 04:13:30

您是如何创建泄漏的对象的?如果你做了这样的事情:

代码语言:javascript
复制
- (void)addObjectsToArray {

    [list addObject:[[MyClass alloc] init];

    OtherClass *anotherObject = [[OtherClass alloc] init];
    [list addObject:anotherObject];
}

然后,当list被释放时,您将泄漏两个对象。

您应该将任何此类代码替换为:

代码语言:javascript
复制
- (void)addObjectsToArray {

    MyClass *myObject = [[MyClass alloc] init];
    [list addObject:myObject];
    [myObject release];

    OtherClass *anotherObject = [[OtherClass alloc] init];
    [list addObject:anotherObject];
    [anotherObject release];
}

更详细地说:

如果你遵循第一种模式,你已经创建了两个对象,根据你拥有的Cocoa memory management rules。放弃所有权是你的责任。如果您不这样做,对象将永远不会被释放,并且您将看到一个泄漏。

不过,您不会立即看到泄漏,因为您将对象传递给数组,数组也会获得它们的所有权。只有当您从数组中删除对象或数组本身被释放时,才会识别泄漏。当这两个事件中的任何一个发生时,数组将放弃对象的所有权,并且它们将在您的应用程序中“活动”,但您将不会有任何对它们的引用。

票数 8
EN

Stack Overflow用户

发布于 2008-10-07 19:08:43

你指的是数组中的对象泄漏吗?

如何将对象添加到数组中?阵列将保留它们,因此您需要在将它们添加到阵列后自动释放或释放它们。否则,在释放数组后,对象仍将保留(泄漏)。

代码语言:javascript
复制
MyEvent *event = [[MyEvent alloc] initWithEventInfo:info];
[self.eventList addObject:event];
[event release];

MyEvent *otherEvent = [[[MyEvent alloc] initWithEventInfo:otherInfo] autorelease];
[self.eventList addObject:otherEvent];
票数 6
EN

Stack Overflow用户

发布于 2008-10-07 18:13:04

你的@property声明是什么样子的?你在合成存取器吗?如果是这样的话,您需要@property(retain)。我假设当您说对象正在攻击您时,您指的是核心转储(EXC\_BAD\_ACCESS)

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/179665

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档