免费与封装

时间:2012-06-10 10:47:41

标签: objective-c memory-management malloc free

在编程中,Kernighan& amp; Ritchie说你为“malloc”分配的所有空间都称之为“免费”。

所以下面的代码是正确的:

- (UIImage*) convertImage:(UIImage*)sourceImage {
   unsigned char *rawData = malloc(requiredSpace);
   ...
   ...
   free(rawData);
   return imageRef;
}

但是你也在函数中有封装。因此从函数返回后,内存将自动释放。因此理论上,在上面的例子中并不是绝对需要free。这是对的吗?

1 个答案:

答案 0 :(得分:4)

绝对没有。

free是必需的,因为仅为静态分配的变量释放内存。如果您使用malloc(以及callocrealloc),您将动态分配不会被释放的内存,除非您明确调用free

例如:

-(void)method {

    char a[10];
    char *b = (char*) malloc(10*sizeof(char));

}

a将在范围的末尾被销毁(至少会被标记为空闲内存,因此您不能再依赖其内容),而b将保留在内存中,直到该计划结束。如果丢失了指向该内存地址的指针(可能为b分配了另一个值,或者只是在不返回b的情况下结束该函数),那么您将无法释放内存,这将带来内存泄漏。