我该如何发布条目对象

时间:2012-07-16 13:38:44

标签: iphone memory-leaks

- (id)init {
    if (self == [super init]) {
        entries = [[NSMutableArray alloc] init];
        NSString *file = [[NSBundle mainBundle] pathForResource:@"qanda" ofType:@"db"];
        sqlite3 *database = NULL;

        if (sqlite3_open([file UTF8String], &database) == SQLITE_OK) {
            sqlite3_exec(database, "select * from qanda order by question", LoadEntriesCallback, entries, NULL);
        }

        sqlite3_close(database);
    }
    return self;
}

在条目对象附近泄漏:'self'时使用的实例变量未设置为[super of self [init ...]]

的结果

在自我附近泄漏:返回而'self'未设置为[super of self [init ...]]

的结果

4 个答案:

答案 0 :(得分:1)

你应该

self = [super init]; 

不是

self == [super init];

最常用的模式是:

self = [super init];
if (self) {
    // Initialisation code
}
return self;

在你的例子中,你没有将[super init]的结果分配给任何东西,而是悬挂,因此泄漏和消息。

如果您想根据标题中的问题发布条目:

entries = [[[NSMutableArray alloc] init] autorelease];

entries = [[NSMutableArray alloc] init];

[entries release];

return之前或dealloc之前。

答案 1 :(得分:0)

您可以通过替换:

来发布条目
entries = [[NSMutableArray alloc] init];

with:

entries = [[[NSMutableArray alloc] init] autorelease];

但我认为问题应该是:这是从数据库中获取内容的好方法吗?坦率地说,如果您将读取内容从数据库部分移动到loadData方法,我认为您的代码会更好

答案 2 :(得分:0)

你应该在创建时自动发布它。

entries = [[[NSMutableArray alloc] init] autorelease];

答案 3 :(得分:0)

尝试替换

entries = [[NSMutableArray alloc] init];

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

并替换

sqlite3_exec(database, "select * from qanda order by question", LoadEntriesCallback, entries, NULL);

sqlite3_exec(database, "select * from qanda order by question", LoadEntriesCallback, self.entries, NULL);