6

クラス (インスタンスではない) で名前によってセレクターを実行し、その戻り値を使用する必要があります。

id obj = [objClass performSelector:NSSelectorFromString(methodName) withObject:p1];

セレクターは、クラスの新しいインスタンスを作成します。返されたインスタンスを使用する必要があります。このプロジェクトはARCでコンパイルされているため、セレクターが不明な警告であるため、通常のPerformSelectorがリークを引き起こす可能性があることは明らかです。

私が正しく理解していれば(ここの回答や他の人から)、この場合、 performSelectorリークを引き起こします(間違っている場合は修正してください。警告を無効にして、それで完了です)。セレクターは次のように実装されます。

+ (id) objectWithFile:(NSString*)p1
{
    return [NSKeyedUnarchiver unarchiveObjectWithFile:p1];
}

文字列からセレクターを使用する必要があり、セレクターがオブジェクトの新しいインスタンスを作成して返す場合のオプションは何ですか?

NSInvocation を検討しましたが、そのgetReturnValue方法では、戻り値が格納される独自の割り当てられたバッファーを提供する必要があります。これが ARC およびクラス メソッドでも機能するかどうか、または単にmalloc さ__bridge_transferれた戻り値バッファーをキャストする必要があるかどうかはわかりませidん。それだけです。

4

1 に答える 1

5

objectWithFile:「alloc、copy、init、mutableCopy、および新しいファミリ」のメソッドではないため、 「Clang/ARC ドキュメント」 の意味での「保持されない戻り値」メソッドです。

保持可能なオブジェクト型を返すが、保持された値を返さないメソッドまたは関数は、戻り境界を越えてオブジェクトがまだ有効であることを保証する必要があります。
...
最悪の場合、これには自動解放が含まれる可能性がありますが、呼び出し元は値が実際に自動解放プールにあると想定してはなりません。

したがって、メソッド内で何をしても、呼び出し元は返されたオブジェクトを解放する必要はありません。

したがって、コードにメモリリークがあるとは思いません。

于 2013-08-03T14:18:35.717 に答える