Я унаследовал приложение, написанное на Objective C. Это приложение, которое записывает на внешний USB-диск Sandisk iXpand, используя SDK, предоставленный Sandisk.
Иногда я вижу сбой приложения, когда кажется, что процессбыл прерван, потому что он разыменовал NULL-указатель.
Что приводит меня к моему вопросу об используемой логике, когда объект NSData "* _writeData" установлен равным другому объекту NSData "srcData". Мне интересно, если srcData по какой-то причине имеет значение NULL, и это вызывает сбой.
Итак, кто-то может объяснить, логично ли делать эту строку? Мне кажется это излишним:
NSData *_writedata = srcData
Почему бы просто не использовать srcData напрямую, как это:
dataCount = [[iXpandFileSystemController sharedController] writeFile:createResult writeBuf:srcData writeSize:(uint32_t)trans];
И если это логичночто нужно сделать NSData *_writedata = srcData
, есть ли способ защитить или отловить, когда он указывает на нулевой указатель.
Это кодовый блок, на который я ссылаюсь:
int total = 0;
int startByte = 0;
int singleTransfer = 8 * 1024 * 1024;
long createResult = 0;
[[iXpandFileSystemController sharedController] deleteFileAbsolutePath:dstPath];
createResult = [[iXpandFileSystemController sharedController] openFileAbsolutePath:dstPath openMode:OF_CREATE | OF_WRITE];
NSError* error;
NSFileHandle* fileHandler = [NSFileHandle fileHandleForReadingFromURL:videoURL error:&error];
uint32_t dataCount = 0;
NSTimeInterval startTime = [[NSDate date] timeIntervalSince1970];
while(true){
@synchronized(self) {
@autoreleasepool {
NSData* srcData = [fileHandler readDataOfLength:singleTransfer];
if([srcData length] == 0){
break;
}
int len = (int)[srcData length];
int trans = len;
NSData *_writeData = srcData;
dataCount = [[iXpandFileSystemController sharedController] writeFile:createResult writeBuf:_writeData writeSize:(uint32_t)trans];
NSLog(@"writing data %ld bytes", dataCount);
if (dataCount == -1)
{
[self.consoleString appendString:[NSString stringWithFormat:@"[%@] [Failed ] ------ Failed \n", [self convertDateFormat:[NSDate date]]]];
return NO;
}
total += trans;
}
}
}