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を使用してこれを確認しました)。ただし、thisTagSet NSMutableSetは、addObjectメソッドを使用している場合でも空のままです。ここで私が間違っていることはありますか?私はまた、次のように2つのステップを分離しようとしました。

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

繰り返しますが、同じ結果です。thisTagObjectを正常に取得しましたが、thisTagSetに何もありません...

4

1 に答える 1

1

コードを読んだ後、2つのことが飛び出します。

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がメモリ管理を行うため、これは必要ありません。

于 2012-01-02T00:09:03.040 に答える