我遇到了一个罕见的间歇性崩溃,看起来像 appendBytes 被称为 -1 因为它的长度。现在,每次使用此方法时,我都对“长度”参数进行了硬编码,因此我看不到这是如何发生的,更糟糕的是,我看不到如何测试并避免这种崩溃。
这是堆栈的顶部和异常(注意~4.2b 长度):
*** Terminating app due to uncaught exception 'NSMallocException', reason: '*** -[NSConcreteMutableData appendBytes:length:]: unable to allocate memory for length (4294967295)'
*** Call stack at first throw:
(
0 CoreFoundation 0x91ec5a67 __raiseError + 231
1 libobjc.A.dylib 0x9950a149 objc_exception_throw + 155
2 CoreFoundation 0x91e2d289 +[NSException raise:format:arguments:] + 137
3 CoreFoundation 0x91e2d1f9 +[NSException raise:format:] + 57
4 Foundation 0x92d2489e _NSMutableDataGrowBytes + 1136
5 Foundation 0x92d24391 -[NSConcreteMutableData appendBytes:length:] + 354
这是应该崩溃的代码的简化版本:
if (self.isConnectedToService) {
NSMutableData *myData = [NSMutableData data];
float newValue = PanValue;
const char theTwo[] = {(char)Chan_L, (char)PanParam};
[myData appendBytes:&theTwo length:2];
[myData appendBytes:&newValue length:4];
}
所以长度总是2或4。
我测试了缓冲区包含多于或少于 2 和 4 的不同情况,但我从未设法故意导致此崩溃。
我在 MacOS10.7.4 和 iOS6.0(在 iPad3 上)上运行了相同的代码,并且偶尔会在两个平台上看到这个问题。
那么 appendBytes 是如何获得这个虚假价值的呢?