1

NSMutableIndexSetを割り当て、他のメソッドで使用するためにこのセット内のオブジェクトを返すこのコードがあります。コードは次のとおりです。

NSMutableIndexSet * indexes = [NSMutableIndexSet new];

for (NSNumber * number in bookmarksArray)
{
    [indexes addIndex:[number intValue]];
}

return indexes;

返されたオブジェクトを解放する方法を調査したところ、上記のコードを次のように編集しました。

return [indexes autorelease];

ただし、メッセージが割り当て解除されたインスタンスに送信されたというエラーが表示されました。これについてどうすればよいですか?助言がありますか?

4

3 に答える 3

2

自動解放されたインスタンスは、実行ループがインスタンスに到達したとき(または、自動解放プールを手動で排出したとき)に解放されます。これは、メソッドNSMutableIndexSetから返されたインスタンスを受け取るメソッドは、制御を実行ループに渡す前に、インスタンスを保持する必要があることを意味します。そうしないと、インスタンスが解放され、無効になっている可能性のある参照がレンダリングされます。

[NSMutableIndexSet new]インスタンスを呼び出して自動リリースするためのショートカットがあります。次のindexSetようにクラスメソッドを呼び出すことができます。

NSMutableIndexSet *indexes = [NSMutableIndexSet indexSet];
// Populate the indexes...
return indexes;
于 2012-06-08T03:10:39.407 に答える
1

自動参照カウント(ARC)を使用している場合は、次を使用する必要があります。

- (NSMutableIndexSet *)bookmarkIndexes
{
    NSMutableIndexSet *indexes = [[NSMutableIndexSet alloc] init];
    for (NSNumber *number in bookmarksArray)
    {
        [indexes addIndex:[number intValue]];
    }

    return indexes;
}

ARCを使用していない場合は、実際に自動リリースする必要があります。

- (NSMutableIndexSet *)bookmarkIndexes
{
    NSMutableIndexSet *indexes = [[[NSMutableIndexSet alloc] init] autorelease];
    for (NSNumber *number in bookmarksArray)
    {
        [indexes addIndex:[number intValue]];
    }

    return indexes;
}
于 2012-06-08T03:09:33.430 に答える
1

このメソッドから取得したインスタンスをivarなどに設定すると、インスタンスが保持されないなどの問題が発生する可能性があります。

return [indexes autorelease]; //this is ok. 

ただし、他のメソッド内では、このメソッドを呼び出してインデックスを取得します。返されたインスタンスインデックスをそのメソッドから除外したい場合は、それを保持する必要があります。取得したインスタンスは自動解放されるため、通常はメソッドから割り当てが解除されます(次の実行ループはここにあります)

NSMutableIndexSet *iVarIndexes;

- (void)otherMethod
{
    iVarIndexes = [[self getBookmarkIndexes] retain]; //for later use
}
于 2012-06-08T05:59:54.143 に答える