Заполнение NSMutableSet с объектом не работает - NSLog и отладчик показывает ноль
Я пытаюсь создать набор объектов, используя 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 ответ
После прочтения вашего кода всплывают две вещи:
Вы не инициализируете свой 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 заботится об управлении памятью.