2

ここに画像の説明を入力私は反対しましたが、デリゲート ブロックを使用しています。ARCを使用しています。

@implementation ViewController

- (void)createGame
{
    _game = [[MRCircusGame alloc] init];
    _game.mainView = self.view;
    _game.stageObjectsDictionary = [self getStageObjectsDictionary];
    [_game prepareGame];
}

- (NSMutableDictionary *)getStageObjectsDictionary
{
    StrongMan *strongMan = [[StrongMan alloc] initAndCreateImageViewWithFrame:kStrongManIntroFrame inView:self.view];
    strongMan.isTakingTouches = NO;
    strongMan.isVisible = NO;
    [tempDictionary setObject:strongMan forKey:kMRCircusStrongMan];
    return tempDictionary;
}

@interface MRCircusGame
{
@property (nonatomic, strong) NSMutableDictionary *stageObjectsDictionary;
}

@implementation StrongMan
..
-(void)method
{
  __weak typeof (self) weak_self = self;
  self.animator.didEndAnimating = ^{
            StrongMan *strongRef = weak_self;
            strongRef.isAnimating = NO;
            [strongRef idle];
  };  
}

いくつかの質問:

自己への弱い参照を使用しない場合、Xcode はリテイン サイクルの可能性について警告を発します。しかし、私はInstrumentsを見て、使用してもメモリリークは検出されませんでしたself.isAnimating = YES;

この strongRef 回避策を使用しないと、BAD_EXCESS が発生することがあるので、weak_self が解放されたと思いますか? アプリのクラッシュを防ぐために常に strongRef を使用する必要がありますか?

このブロックの実行が終了すると、strongRef は解放されますか?

4

4 に答える 4

1

私は以前に同様の問題を経験しました。この問題の主な理由は、アニメーションが終了する前にオブジェクトの割り当てが解除されることです。そのため、ブロックが実行されると、参照される「自己」は存在しません。

この問題には 2 つの解決策があると思います。

  1. 「dealloc」メソッドをオーバーライドしてから、nil を self.animator.didEndAnimating に割り当てます。したがって、アニメーションの後には何も実行されません。

  2. このブロックでは、weather "self" が nil かどうかを確認してから、やりたいことを実行できます。

于 2013-04-28T15:26:22.520 に答える
0

弱参照を使用していStrongManて、アニメーションが停止する前に のインスタンスの割り当てが解除されると、アプリがクラッシュします。クラッシュを防ぐには、オブジェクトの割り当てが解除されているときに参照を削除する必要があります。deallocメソッドで次のコードを使用すると、それが実行されます。

self.animator.didEndAnimating = nil;
于 2013-04-28T15:18:38.473 に答える
-1

これを行う適切な方法は、インスタンス変数に直接アクセスすることです。

_animator.didEndAnimating = ^{ .... };
于 2013-04-28T12:55:20.027 に答える