2014-06-22 2 views
0

У меня есть это свойство в моем файле .h:Xcode цель с, EXC_BAD_ACCESS

@property (nonatomic, readwrite) NSInteger gameMode; 

И у меня есть этот сеттер в соответствующем файле .m:

- (void)setGameMode:(NSInteger)mode { 
    self.gameMode = mode; 
    NSLog(@"game mode %d", self.gameMode); 
} 

На мой взгляд контроллера, я имеют эту функцию для вызова сеттера, когда я прикасаюсь к кнопке:

- (IBAction)touchCardButton:(UIButton *)sender { 
    if ([self.game disableModeChooseAtFirstTouch]) { 
     [self.game setGameMode:self.modeSegmentedControl.selectedSegmentIndex]; 
} 

Но когда я нажимаю на кнопку в тренажере, он остановится здесь:

self.gameMode = mode; 

И говорит:

Тема 1: EXC_BAD_ACCESS

Update: Если добавить NSLog перед ним, как это:

- (void)setGameMode:(NSInteger)mode { 
    NSLog(@"game mode %d", self.gameMode); 
    self.gameMode = mode; 
    NSLog(@"game mode %d", self.gameMode); 
} 

Он будет держать печать game mode: 0

stack tracestack trace

Может ли кто-нибудь сказать мне, почему? Благодаря!

+0

сообщение полное сообщение об ошибке и трассировку стека плз –

+0

вам нужно узнать, как отлаживать добавить точку останова для всех за исключением – meda

+0

Вы находитесь в бесконечном цикле. –

ответ

3

Да, я могу вам сказать, почему. Вы вызываете сеттер в сеттере, вызывая бесконечную рекурсию, переполнение стека и сбой.

Ваш метод setGameMode следует читать:

- (void)setGameMode:(NSInteger)mode 
{ 
    _gameMode = mode; //Don't use the setter in the implementation of the setter. 
    NSLog(@"game mode %d", self.gameMode); 
} 
+0

@ randomp: Кроме того, если вы не делаете ничего особенного в сеттере, не пишите. Просто используйте '@ property'. –

+0

Вижу. Я новичок в разработке iOS. Похоже, мне нужно больше понимания. Благодаря! – randomp

+0

У Энрико есть хороший момент. Ваш текущий сеттер не делает ничего, кроме синтезатора, созданного компилятором. Избавьтесь от своего настраиваемого сеттера, и проблема исчезнет. –

Смежные вопросы