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