У меня есть объект, и он использует делегатский блок. Я использую ARC.Слабая ссылка на self in block вызывает иногда BAD_EXCESS
@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 делает некоторые предупреждения о возможном сохранить цикла. Но я смотрю на инструменты и никакой утечки Memery не было обнаружено даже я использую self.isAnimating = YES;
Если я не использую этот strongRef обходной путь, иногда я BAD_EXCESS, так что я думаю, что это weak_self был выпущен я прав? Должен ли я использовать strongRef все время, чтобы предотвратить падение моего приложения?
Будет ли strongRef освобожденным после завершения этого блока?
Невозможно получить EXEC_BAD_ACCESS из кода, который вы указали.Да, если 'self' был освобожден до блокировки блока, тогда' weak_self' будет 'nil', и так будет' strongRef'. Но вы просто вызываете методы на 'strongRef', а методы вызова на' nil' - в Objective-C. У вас должна быть проблема где-то в другом месте. – newacct
Кроме того, изображение, которое вы показываете, не соответствует вашему коду. Что он? – newacct
Не должно быть ссылки внутри блока, чтобы быть слабым, а не самим собой? (внутри изображения) – mnl