首页 > 解决方案 > 将 NSData 对象分配给另一个 NSData 对象的逻辑

问题描述

我继承了一个用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;

        }
        }
    }

标签: objective-c

解决方案


如果这是合乎逻辑的事情,当它指向一个指针NSData *_writedata = srcData时,有没有办法保护或捕获。NULL

在您的代码中,当执行上述赋值时,srcData由于前面的原因,已知它是非空的:

if([srcData length] == 0){
   break;
}

如果为 null 或非 null 并返回零,则表达式[srcData length]将计算为零。因此,一旦过去,就知道它是非空的。srcDatalengthsrcData

您是对的,对两者的分配_writeData都是trans多余的但无害的。

无论您的问题是什么,都不是这些作业。

好狩猎!


推荐阅读