長さとして -1 を指定して appendBytes が呼び出されているように見える、まれな断続的なクラッシュが発生します。現在、このメソッドを使用するたびに「長さ」引数をハードコーディングしているため、これがどのように発生するかがわからず、さらに悪いことに、このクラッシュをテストして回避する方法もわかりません。
これがスタックの一番上と例外です (~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 はどのようにして偽の値を取得しているのでしょうか?