Заполнить NSMutableSet с объектом не работает - NSLog и отладчик показывает ноль - PullRequest
2 голосов
/ 02 января 2012

Я пытаюсь создать набор объектов, используя NSMutableSet.Объект является тегом, каждый тег имеет идентификатор и имя.

Класс тегов определен так:

#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, я получаю заполнение объекта, его идентификатора и имени (я подтвердил это, проверив отладчик и также используя NSLog).NSMutableSet thisTagSet, однако, остается пустым, хотя я использую метод addObject.Я что-то здесь не так делаю?Я также попытался разделить два этапа следующим образом:

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

Опять тот же результат.Я успешно получил thisTagObject, но ничего в thisTagSet ...

1 Ответ

1 голос
/ 02 января 2012

После прочтения вашего кода всплывают две вещи:

Вы не инициализируете свой NSMutableSet, и вы теряете свои теги, возвращая сохраненный объект в вашем методе класса.

Редактировать: добавлен код устранения утечки

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

    return [myTag autorelease];
}

2-е редактирование: приведенный выше код применяется только при отключенной функции ARC. В противном случае это не нужно, так как ARC заботится об управлении памятью.

...