我得到了一个罕见且间歇性的崩溃,看起来像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如何获得虚假价值?