21

-postNotificationName:object: userInfo:私の質問は、メソッド に追加されるオブジェクトに関するものです。

NSNotification はオブジェクトを保持しますか? (NSMutableDictionary または Array と同様の方法で) ... 通知を投稿した後にオブジェクトを解放できることを意味します

以下は、私の質問を説明するのに役立つコードスニペットです...オブジェクトを解放することは有効ですか。Apple のドキュメントへのリンクは非常に役立ちます。

NSMutableDictionary *teamDictCopy = [self.teamDict mutableCopy];
[teamDictCopy setObject:[NSNumber numberWithInt:self.scrollViewIndex] forKey:@"imageIndex"];

if([self.statusButton.title isEqualToString:@"Completed"]){
    [[NSNotificationCenter defaultCenter] postNotificationName:@"UnComplete" object:teamDictCopy userInfo:nil];
}

[teamDictCopy release];
4

2 に答える 2

31

「NSNotification はオブジェクトを保持しますか? (NSMutableDictionary または Array と同様の方法で) ... 通知を投稿した後にオブジェクトを解放できることを意味します」

objectおよびパラメータがそのメソッドによって保持されているかどうかはわかりませんuserInfoが、実際には問題にはなりません。

NSNotificationCenterこれらの通知を作成し、非同期でブロードキャストすることを想像していると思いますが、そうではありません。NSNotificationCenter( NSNotificationCenter Class Referenceを参照)のドキュメントに記載されているように、通知は同期的に投稿されます。

通知センターは、オブザーバーに同期的に通知を配信します。つまり、 postNotification:すべてのオブザーバーが通知を受信して​​処理するまで、メソッドは返されません。通知を非同期に送信するには、 を使用します NSNotificationQueue。マルチスレッド アプリケーションでは、通知は常に、通知が投稿されたスレッドで配信されます。これは、オブザーバーが自身を登録したスレッドと同じではない場合があります。

したがって、コードでは、通知センターが通知を作成し、デフォルト センターを介してブロードキャストします。この通知名とオブジェクトの組み合わせに登録されているすべてのオブジェクトは、通知を受け取り、その通知に登録したときに指定したセレクターを実行します。その後、制御は通知を送信したクラスに戻ります。

言い換えれば、コードが[teamDictCopy release]行に到達するまでに、teamDictCopywill はすべての関係者によって既に「使用」されています。したがって、それを解放することに危険はないはずです。

慣習についてのメモ。通常、object:パラメーターは通知を送信するオブジェクトを意味し、パラメーターは追加情報をuserInfo:意味します。NSDictionaryしたがって、通常、次のように通知を処理します。

NSMutableDictionary *teamDictCopy = [self.teamDict mutableCopy];
[teamDictCopy setObject:
   [NSNumber numberWithInt:self.scrollViewIndex] forKey:@"imageIndex"];

if([self.statusButton.title isEqualToString:@"Completed"]){
 [[NSNotificationCenter defaultCenter] postNotificationName:@"UnComplete" 
     object:self userInfo:teamDictCopy];
    }

[teamDictCopy release];
于 2011-03-18T02:49:11.023 に答える
5

はい - オブジェクトが通知のオブジェクトとして設定されたら、オブジェクトを解放できます。

サブクラス化することもできます。

特定の文書/声明に関する限り、具体的には覚えていません。

ただし、これはオブジェクト、そのインスタンス変数、および型がオブジェクトであると識別される場合の分散通信とシグナリングの基礎です。

私はあなたのためにテストを書いたので、これで安心できます。オブジェクトが保持されていない場合、通知の使用例はほとんどありません。指示された場所にブレークポイントを追加してから、ブレークポイントを有効にして実行してください。楽しい!

#import <Foundation/Foundation.h>

@interface MONObject : NSObject
@end

@implementation MONObject

- (id)retain {
    return self; /* << add breakpoint here */
}

/* needed to counter retain override
   (although all MONObjects will leak in this example)
*/
- (void)release {
}

@end

int main(int argc, const char* argv[]) {
    NSAutoreleasePool * pool = [NSAutoreleasePool new];

    NSString * name = @"UnComplete";
    MONObject * obj = [MONObject new];
    [[NSNotificationCenter defaultCenter] postNotificationName:name object:obj userInfo:nil];
    [obj release], obj = 0;

    [pool drain];
    return 0;
}
于 2011-03-17T21:55:56.133 に答える