Iphone:这是个坏主意吗?内存管理/泄漏问题

时间:2010-09-26 15:08:18

标签: iphone objective-c cocoa-touch memory-management initialization

我有一个基本管理核心数据的课程。插入删除和更新数据。 我像这样初始化这个类

- (id)init
{
    self = [super init];
    if (self) {
        self.itemList = [NSDictionary dictionaryWithObjectsAndKeys: // <== LEAKS
                    ITEMURL1, KEY1,
                    ITEMURL2, KEY2,
                    ITEMURL3, KEY3,
                    ITEMURL4, KEY4,
                    ITEMURL5, KEY5,
                    nil];
        self.storedItems = [[NSMutableArray alloc] init]; // <== LEAKS

    }
    return self;
}


- (void)dealloc {
    [storedItems release];
    [super dealloc];
}

我小心翼翼地释放每一个物体。无论何时分配它,但是当我在Instruments中运行应用程序时,我似乎仍然在初始化时泄漏。

发生了什么事?我做错了什么?

2 个答案:

答案 0 :(得分:1)

你需要在你的dealloc方法中添加[itemList release](假设你在属性声明中得到了“retain”。

对于storedItems,如果你在属性声明中保留了,你应该在分配它时自动释放它:

self.storedItems = [[[NSMutableArray alloc] init] autorelease];

或更简洁,但等效:

self.storedItems = [NSMutableArray array];

答案 1 :(得分:0)

关于storedItems:

如果storedItems声明为

@property (nonatomic, retain) NSMutableArray *storedItems;

(保留部分很重要) 然后你需要做:

NSMutableArray *storedItems_ = [[NSMutableArray alloc] init];
self.storedItems = storedItems_;
[storesItems_ release];

alloc + init会导致你的object9¥的保留计数变为1。 然后使用self.xxx将再次保留它,如您的属性的属性中声明的那样。因此它将是2.这不会发生在assign