2015-04-07 4 views
3

Этот простой код ниже работает в отладке, но терпит неудачу в выпуске на iPhone 6.EXC_BAD_ACCESS в простом коде в версии

XCode 6.2 (6C131e)

Calling RunTest вызывает EXC_BAD_ACCESS на последних 64-битных iPhone'ов. И это происходит только при установке уровней оптимизации «Быстрее» и выше: -O2, -O3, -Os или -Ofast. Так обычно в конфигурации Release. BTW, код работает хорошо, когда уровни оптимизации установлены «Нет» или «Быстро»: -O0 или -O1.

#import <objc/NSObject.h> 

@interface Foo : NSObject 
@end 

@interface Test : NSObject { 
    Foo *field; 
} 
@end 

@implementation Foo 

- (Foo *)bar { 
    return self; 
} 

@end 

@implementation Test 

- (void)runTest { 
    Foo *foo = [[Foo alloc] init]; 
    field = foo; 
    field = nil; 
    [foo bar]; 
} 

@end 

Пожалуйста, объясните мне, почему это происходит.

+2

В процессе оптимизации инструкции чередуются сложными способами. Таким образом, предположительно, вы освобождаете 'поле' (я предполагаю, что вы используете ARC), но это не свойство nilified, прежде чем мы достигнем попытки отправить сообщение' bar'. (Иногда я считаю, что что-то простое, как дополнительный NSLog после команды nilification, может предотвратить такой крах.) Ситуация совершенно искусственная, поэтому Do Do Do Do That That. Отправьте пример Apple в качестве отчета об ошибке, если вы хотите сделать что-то полезное. – matt

+0

Спасибо за совет, отправленный в Apple Bug Reporter, ID проблемы 20449878 –

ответ

0

Я разместил проблему для Apple Bug Reporter, но Apple однажды запросила более подробную информацию, а затем никогда не отвечала. Теперь отчет о проблеме полностью исчез.

Кстати, это похоже на работу с clang, версия 7.3.

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