使用ARC在C阵列中释放Objective C对象

时间:2012-09-02 14:55:33

标签: iphone ios5 xcode4.2 automatic-ref-counting

我不知道如何发布我存储在老式c-array中的Objective-C对象。

(注意:在经过大量搜索后写这篇文章时,我想我在测试代码中发现了一个错误,所以这似乎是一个解决方案,而不是一个问题。好吧,我花了很多时间在它上面所以无论如何我都会发布它......)

我想将旧代码转换为ARC,因为我花了太多时间来调试与内存管理相关的错误(抱歉---保留/发布规则根本没有硬连线在我的脊椎中并且我花了几个小时来找到丢失的保留,因为错误会在不相关的时刻弹出,可能是在内存清理期间或之后)。

所以我有一些带有c风格数组的现有代码(比如UILabel*' s的二维数组),我可以愉快地calloc()指针并通过一些访问它们array[col*colstride+row*rowstride],其中array的类型为UILabel **;我们假设UILabel*以随机顺序填充,因此我无法使用NSMutableArray

现在在ARC中,编译器希望我将array的类型设为UILabel *__strong*,似乎(有些人将其写为__strong UILabel **)。

我不明白的是,当我需要时,我可以告诉ARC释放UILabel个对象(比如在dealloc()我的对象中使用c-数组)。在尝试理解问题时,我有一小组对象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-array中(因此MemoryUnit代替上面提到的UILabel。为了测试,我有代码

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

在其dealloc()中进行调试。

1 个答案:

答案 0 :(得分:0)

正如布莱恩所说,我们需要在堆栈溢出系统中得到答案。 所以我这样做:

<强>解决方案

显然,将MemoryUnit *__strong类型的数组元素设置为nil会导致释放该对象,就好像该元素已在@propetty@synthesize对中声明一样的陈述。这实际上是在C-style array of pointers to Objective-C objects under ARC我认为

中提出的

(我发现XCode中的文档非常简洁,ARC编译器定义只告诉我不允许的内容,而不是提示如何正确地执行操作。)