プロパティにgetterとsetterというカスタム名が付いている場合は、プロパティ値を取得または設定するユーティリティを作成しています。 279 hereの完全な文脈を見ることができます。関連するスニペットはここにある:NSValueとNSInvocationを持つフリーとmalloc
- (id) getFrom:(id) object {
NSMethodSignature *methodSig = [[object class] instanceMethodSignatureForSelector:[self getter]];
NSInvocation *inv = [NSInvocation invocationWithMethodSignature:methodSig];
[inv setSelector:[self getter]];
[inv setTarget:object];
[inv invoke];
if ([self isObject]) {
id returnValue;
[inv getReturnValue:&returnValue];
return returnValue;
} else {
void *buffer;
NSUInteger length = [methodSig methodReturnLength];
buffer = (void *)malloc(length);
[inv getReturnValue:buffer];
NSValue *value = [NSValue valueWithBytes:buffer objCType:[methodSig methodReturnType]];
//FIXME: Memory leak for buffer! But if we free it, [value getValue:] is a dangling pointer.
//free(buffer)
return value;
}
}
問題は、プロパティがスカラのとき、私は(多くのキー値コーディングのような)NSValueを返したいということです。しかし、NSInvocationの戻り値は参照によって返され、the apple documentation(下部を参照)によれば、NSValueがまだ存在する間にスカラーに関連するメモリを解放することはできませんが、NSValueを返すのでいつメモリを解放するか分からない。
文書を間違って読んでいますか? NSValueはこれを何とか自動的に処理しますか?または、この状況でメモリを適切に解放するにはどうすればよいですか?
ああ、私は間違ってリンゴのドキュメントを読んでいるに違いありません。ありがとう、それは確かに物事を簡素化する! – jagill
@ジャッジル問題ありません!私は自分のテストアプリケーションを書くまで、個人的に答えを知らなかった! –