1

ブロック内の2つのBOOL変数をクリーンな方法でインスタンス化するにはどうすればよいですか?

以下のように、それは機能していますが、私は「このブロックで「自己」を強くキャプチャすると、保持サイクルにつながる可能性があります」としています。これは明らかに良くありません...

    [notificationCenter addObserverForName:UIApplicationDidEnterBackgroundNotification
                                    object:nil
                                     queue:mainQueue usingBlock:^(NSNotification *note) {
                                         isApplicationOnForegroundMode = NO;
                                         isApplicationOnBackgroundMode = YES;
                                     } ];


    [notificationCenter addObserverForName:UIApplicationDidBecomeActiveNotification
                                    object:nil
                                     queue:mainQueue usingBlock:^(NSNotification *note) {
                                         isApplicationOnForegroundMode = YES;
                                         isApplicationOnBackgroundMode = NO;
                                     } ];
4

1 に答える 1

3

私はそれを推測しisApplicationOnForegroundModeisApplicationOnBackgroundModeivarsです。

観測ブロックを追跡して削除できるように、いくつかのivarまたはプロパティを追加する必要があります。これらのidプロパティをbackgroundObserverおよびactiveObserverと呼びます。

コードを次のように更新します。

__unsafe_unretained <<self's class>> *this = self; // or __weak, on iOS 5+.

self.backgroundObserver = [notificationCenter 
                             addObserverForName:UIApplicationDidEnterBackgroundNotification
                                         object:nil
                                          queue:mainQueue 
                                     usingBlock:^(NSNotification *note) {
                                         this->isApplicationOnForegroundMode = NO;
                                         // or: this.isApplicationOnForegroundMode = YES, if you have a property declared
                                         this->isApplicationOnBackgroundMode = YES;
                                     } ];


self.activeObserver = [notificationCenter 
                         addObserverForName:UIApplicationDidBecomeActiveNotification
                                     object:nil
                                      queue:mainQueue usingBlock:^(NSNotification *note) {
                                          this->isApplicationOnForegroundMode = YES;
                                          this->isApplicationOnBackgroundMode = NO;
                                      } ];

また、必ず電話する必要があります

[[NSNotificationCenter defaultCenter] removeObserver:self.backgroundObserver];
[[NSNotificationCenter defaultCenter] removeObserver:self.activeObserver];

-dealloc

于 2013-03-06T04:42:57.773 に答える