2012-09-02 102 views
2

我不知道如何释放一个Objective-C对象,我已经存储在一个老式的c数组。 (注意:在经过大量搜索之后写这篇文章时,我想我在测试代码中发现了一个错误,所以这似乎是一个解决方案,而不是一个问题。那么,我花了很多时间在它上面我会发布它......)发布Objective-C对象与ARC数组C对象

我想将旧代码转换为ARC,因为我花费了太多的时间来调试内存管理相关的错误(抱歉---保留/释放规则只是简单的在我的脊椎上并没有硬连线,并且我花了几个小时才找到一个失踪的保留,因为这些错误在无关的时刻弹出,可能在记忆清理期间或之后)。

所以我有与c-风格数组一些现有的代码(比如说的UILabel*的一个二维阵列),其中I可以愉快地calloc()指针和访问它们通过一些array[col*colstride+row*rowstride],其中array是类型UILabel **的;我们假设UILabel*以随机顺序填充,所以我不能使用NSMutableArray

现在在ARC中,编译器希望我使array的类型为UILabel *__strong*,看起来(有些人会这样写为__strong UILabel **)。

我不明白的是我该如何告诉ARC在需要时释放UILabel对象(比如在使用c数组的对象的dealloc()中)。在试图理解这个问题时,我有一小组对象MemoryMemoryUnit,前者试图存储后者的大c-阵列。

-(Memory*)init { 
    self = [super init]; 
    if (self) { 
    MemoryUnit * unit = [[MemoryUnit alloc] init]; 
    array = (__strong id *) calloc(sizeof(MemoryUnit*), 1024); 
    array[0] = unit; 
    } 
    return self; 
} 

-(void)dealloc { 
    for (int i=0; i<1024; i++) array[i]=nil; 
    free(array); 
} 

MemoryUnit我们有物体被存储在C-阵列(因此这是MemoryUnit在上述UILabel的地方)英寸对于测试,我的代码为

-(void)dealloc { 
    NSLog(@"removed %x", (int)self); 
} 

在其dealloc()进行调试。

+2

您应该添加您的解决方案作为答案,而不是将其附加到问题上。理解起来要容易得多,而且可以链接到答案。 –

回答

0

正如Bryan所说,我们需要一个堆栈溢出系统的答案。 所以我做的:

解决方案

显然,MemoryUnit *__strong类型的数组元素设置为nil导致对象被释放,因为如果这个元素已经在@propetty@synthesize语句对已申报。这在C-style array of pointers to Objective-C objects under ARC居然建议我觉得

(我发现XCode中非常简洁的文档,以及ARC的编译器定义,只告诉我什么是不允许的,而不是给如何正确做事情的提示。)