我继承了用Objective C编写的应用程序。它是一个使用Sandisk提供的SDK写入外部Sandisk iXpand USB驱动器的应用程序。
有时,我看到应用程序崩溃,因为进程取消引用了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
是合乎逻辑的,那么当它指向NULL指针时,有没有一种方法可以保护或捕获它。
这是我指的代码块:
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;
}
}
}
如果这样做
NSData *_writedata = srcData
是合乎逻辑的,那么当它指向NULL
指针时,有没有一种方法可以保护或捕获它。
由于上述原因,在您的代码中执行上述分配时srcData
已知为非空:
if([srcData length] == 0){
break;
}
[srcData length]
如果srcData
为null或为非null,则表达式的计算结果为零,并length
返回零。因此,一旦过去srcData
就知道它是非空的。
你是正确的,分配到两个_writeData
和trans
是多余的,但无害。
无论您遇到什么问题,都不是这些任务。
打得好!
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句