4

メソッドを使用して通知を投稿する必要があり、反対側で取得できるようにカスタム クラスをpostNotificationName:object:userInfo:渡しています。このまま使うべきかFileItemuserInfoautorelease

FileItem *item = [[[FileItem alloc] init] autorelease];
[[NSNotificationCenter defaultCenter] postNotificationName:@"dataReceived" object:self userInfo:item];
[item release];

または、オブジェクトをデフォルトの通知センターに渡した直後にオブジェクトを渡すことはallocできますか?release

FileItem *item = [[FileItem alloc] init];
[[NSNotificationCenter defaultCenter] postNotificationName:@"dataReceived" object:self userInfo:item];
[item release];

オブジェクトをメッセージのパラメーターとして別のオブジェクトに渡すたびに、受信オブジェクトは必要に応じて保持を行い、そのパラメーターを安全に解放できると想定しているため、ここで規則を取得しようとしていますか?

4

2 に答える 2

3

2 番目のオプションが正しいオプションです。次のこともできます。

FileItem *item = [[[FileItem alloc] init] autorelease];
[[NSNotificationCenter defaultCenter] postNotificationName:@"dataReceived" object:self userInfo:item];

alloc従来の知恵では、 、copy、またはごとに、対応する(または)retainが必要です。それ以上のことを行うと、オブジェクトがオーバーリリースされることがほぼ保証されます。releaseautorelease

于 2009-06-04T03:26:56.277 に答える
2

autoreleaserelease単に「後でこれに送信する」という意味です。送信autoreleasereleaseてから同じオブジェクトに送信すると、2 回解放されます。Matt Ball が言うように、後者の例と彼の例は同等です。

さらに言えば、自分が所有しているものだけをリリースします。リリースすると、所有しなくなり、自分のものではないと見なす必要があります。最初の例では、最初のリリースの後、そのオブジェクトの所有をやめました。2 番目のリリースは、所有していないオブジェクトをリリースするため、明らかに間違っています。

また、他のオブジェクトが所有しているオブジェクトは、自分も所有していない限り、決して解放しないでください。

于 2009-06-04T04:13:55.633 に答える