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];
  };  
}

一些问题:

如果我不使用对 self 的弱引用,Xcode 会对可能的保留周期发出一些警告。但是我看了一下仪器,即使我使用也没有检测到内存泄漏self.isAnimating = YES;

如果我不使用这个 strongRef 解决方法,有时我会得到 BAD_EXCESS 所以我认为它 weak_self 被释放了,对吗?我应该一直使用 strongRef 来防止我的应用程序崩溃吗?

当这个块执行结束时,strongRef 会被释放吗?

4

4 回答 4

2

对弱引用进行强引用是在块运行时保持自身活动的常用技术。在块的末尾 strongRef 将被释放。

Instruments 只会在以下情况下显示无法访问的对象

  • 您在块内使用对 self 的强引用
  • 并且您不会在 dealloc 中消除对块的引用
  • 你没有提到强人
于 2013-04-28T16:04:19.267 回答
1

我以前遇到过类似的问题。问题的主要原因是,对象在动画结束之前被释放。所以当块被执行时,引用的“自我”不存在。

我认为这个问题有两种解决方案:

  1. 您覆盖“dealloc”方法,然后将 nil 分配给 self.animator.didEndAnimating。所以动画之后什么都不执行。

  2. 在块中,您可以检查天气“自我”是否为零,然后做您想做的事。

于 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 回答