4
我很難試圖調試iOS上的問題,這似乎只與發佈版本發生,似乎暗示優化器正在做一些播放不好的東西用我的代碼。崩潰的代碼是一些將一些二進制數據序列化爲NSMutableData實例的代碼,如下所示。Objective C Seg Fault只有在啓用編譯器優化時纔會發生
[_data increaseLengthBy:sizeof(CFSwappedFloat64)];
*((CFSwappedFloat64 *)[self pointerAtOffset]) = CFConvertFloat64HostToSwapped(value);
_offset += sizeof(CFSwappedFloat64);
_data是一個NSMutableData實例。 pointerAtOffset和這個類的init方法定義如下。
- (unsigned char *)pointerAtOffset {
return ((unsigned char *)_data.mutableBytes) + _offset;
}
- (id)init {
if(self = [super init]) {
_data = [[NSMutableData alloc] initWithCapacity:1028];
_offset = 0;
}
return self;
}
現在奇怪的是,如果我添加一個NSLog打印語句,它修復了錯誤。
[_data increaseLengthBy:sizeof(CFSwappedFloat64)];
NSLog(@"%d - %d", (int)_data.mutableBytes, _offset);
*((CFSwappedFloat64 *)[self pointerAtOffset]) = CFConvertFloat64HostToSwapped(value);
_offset += sizeof(CFSwappedFloat64);
任何想法可能會導致這種情況?部署由於NSLog語句而工作的代碼有點令人不安。
不知道是否值得注意的是,如果我複製pointerAtOffset內聯的實現,它也似乎不會崩潰。 – ddt 2013-02-16 07:36:13
我看起來像優化器無法看到'increaseLengthBy:'和'pointerAtOffset'都引用'_offset',所以它將移動呼叫。有沒有辦法('#pragma'?)在本地降低優化級別或強制正確的調用序列?否則,你可以爲整個文件做,直到找到更好的解決方案。 NSLog調用強制執行此命令,這就是爲什麼當它被保留時它會工作。 – Monolo 2013-02-16 12:16:09
您是否使用ARC?在使用指針之前可能會自動釋放_data。 – monoxygen 2013-02-17 22:50:45