Использование байта * вместо NSData: мой код в порядке? - PullRequest
0 голосов
/ 07 февраля 2012

Этот код работает, но я в основном промахиваюсь из-за недостатка знаний в C. Код работает, и кажется быстрее , чем создание NData экземпляров каждый раз, когда мне нужно сделатьвызов метода.Но все ли в порядке (нет утечек, нет указателей)?

Меня особенно беспокоит приведение к Byte*, которое было необходимо, чтобы компилятор передавал по конвейеру:

Вот код, упрощенный:

- (BOOL) isThisMethodOkay {
    // I have a length, range and an NSData instance
    Byte bytes[self.data.length]; 
    [self.data getBytes:&bytes range:range];
    return [self doSomething:bytes length:length]
}

- (BOOL) whatAboutThis {
    return [self doSomething:(Byte*)self.data.bytes length:self.data.length];
}

- (BOOL) doSomething:(Byte*)bytes length:(NSUInteger)length {
    return (length == CHECK_LENGTH && data1(bytes) == CHECK_DATA_1);
}

static int data1(Byte* bytes) {
    int retVal = (int)bytes[1];
    return retVal;
}

Примечание: весь код находится под ARC.

Ответы [ 2 ]

1 голос
/ 07 февраля 2012

Нет утечек памяти, поскольку bytes - это VLA , который использует стек.Если вы планируете обрабатывать большие объемы данных, вы можете рассмотреть возможность размещения этих данных в куче, а затем освободить их, когда закончите.(Вы также можете использовать uint8_t вместо Byte)

- (BOOL) isThisMethodOkay {
    // I have a length, range and an NSData instance
    uint8_t *bytes = malloc(self.data.length); 
    [self.data getBytes:&bytes range:range];

    BOOL result = [self doSomething:bytes length:length];
    free(bytes);
    return result;
}
1 голос
/ 07 февраля 2012

Этот код подходит, поскольку вы не используете malloc, который выделяет память в куче.Нет утечки: вы просто создаете локальный массив Byte.

...