2

我不知道如何释放存储在老式 c 数组中的 Objective-C 对象。

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

我想将旧代码转换为 ARC,因为我在调试与内存管理相关的错误上花费了太多时间(对不起——保留/释放规则根本没有固定在我的脊椎中,而且我真的需要几个小时找到丢失的保留,因为错误在不相关的时刻弹出,可能在内存清理期间或之后)。

所以我有一些带有 c 样式数组的现有代码(比如一个二维数组UILabel*),我可以很高兴地calloc()通过指针访问它们array[col*colstride+row*rowstride],其中array类型为UILabel **; 假设UILabel*s 是按随机顺序填充的,所以我不能使用 an NSMutableArray

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

我不明白的是,我如何告诉 ARC 在需要释放UILabel对象时释放对象(比如在dealloc()使用 c 数组的对象中)。在试图理解这个问题时,我有一小部分对象,Memory并且MemoryUnit,前者试图存储后者的一个大型 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()的调试。

4

1 回答 1

0

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

解决方案

显然,将 type 的数组元素设置MemoryUnit *__strongnil会导致对象被释放,就好像这个元素已经在 a @propettyand @synthesizepair 语句中声明了一样。这实际上是在我认为ARC 下指向 Objective-C 对象的 C 样式指针数组中提出的

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

于 2013-01-25T09:23:36.907 回答