2

我正在尝试使用 NSMutableSet 创建一组对象。对象是一个标签,每个标签都有一个id和一个名字。

标签类的定义如下:

#import "Tag.h"

@implementation Tag

@synthesize id, name;

+(id) populateTagObjectWithId:(NSString *)id andName:(NSString *)name
{
    Tag *myTag = [[self alloc] init];
    myTag.id = id;
    myTag.name = name;

    return myTag;
}
... remainder of code snipped out

在我的应用程序的其他地方,我使用 SQLite 来获取 TAG 表中的标签。我使用 while 循环进行迭代,对于每次迭代,我构建一个标记对象,然后尝试将其添加到集合中。下面的代码:

... previous code snipped out...
NSMutableSet *thisTagSet;

while(sqlite3_step(tag_statement) == SQLITE_ROW)
{
    NSString *thisTagId     = [[NSString alloc] initWithUTF8String:(const char *) sqlite3_column_text(tag_statement, 0)];
    NSString *thisTagName   = [[NSString alloc] initWithUTF8String:(const char *) sqlite3_column_text(tag_statement, 1)];

    [thisTagSet addObject:[Tag populateTagObjectWithId:thisTagId andName:thisTagName]];

    ... rest of code snipped out...

因此,正如我所提到的,当我遍历这个 while 循环时,我得到了正在填充的对象及其 id 和名称(我已经通过检查调试器并使用 NSLog 确认了这一点)。然而,即使我使用 addObject 方法,thisTagSet NSMutableSet 仍然为空。我在这里做错了吗?我也试过像这样分开两个步骤:

Tag *thisTagObject = [Tag populateTagObjectWithId:thisTagId andName:thisTagName];
[thisTagSet addObject:thisTagObject];

同样的结果。我成功获得了 thisTagObject,但 thisTagSet 中没有任何内容...

4

1 回答 1

1

阅读您的代码后,会弹出两件事:

您没有初始化 NSMutableSet,而是通过在类方法中返回保留对象来泄漏标签。

编辑:添加了泄漏修复代码

+(id)tagObjectWithId:(NSString *)id andName:(NSString *)name
{
    Tag *myTag = [[self alloc] init];
    myTag.id = id;
    myTag.name = name;

    return [myTag autorelease];
}

第二次编辑:上面的代码仅适用于禁用 ARC 的情况。否则不需要它,因为 ARC 负责内存管理。

于 2012-01-02T00:09:03.040 回答