使用Byte *代替NSData:我的代码可以吗?

时间:2012-02-07 14:44:22

标签: objective-c bytearray

这段代码一切正常,但我基本上在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 个答案:

答案 0 :(得分:1)

这段代码很好,因为你没有使用malloc wchich在堆中分配内存。您只是在创建本地Byte数组时没有泄漏。

答案 1 :(得分:1)

由于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;
}