Логика при назначении объекта NSData другому объекту NSData - PullRequest
1 голос
/ 11 октября 2019

Я унаследовал приложение, написанное на 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;

        }
        }
    }

1 Ответ

1 голос
/ 12 октября 2019

И если это логично NSData *_writedata = srcData, есть ли способ защитить или отловить, когда он указывает на указатель NULL.

В вашем коде, когдауказанное выше выполнение srcData известно как ненулевое из-за предыдущего:

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

Выражение [srcData length] будет иметь нулевое значение, если srcData равно нулю или если оно не равно нулю иlength возвращает ноль. Так что после этого srcData считается ненулевым.

Вы правы, назначения для _writeData и trans избыточны, но безвредны.

Независимо от вашей проблемыэто не эти задания.

Удачной охоты!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...