【问题标题】:Release Objective C object in C-array with ARC使用 ARC 在 C 数组中释放 Objective C 对象
【发布时间】:2012-08-27 13:05:36
【问题描述】:

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

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

我想将旧代码转换为 ARC,因为我在调试与内存管理相关的错误上花费了太多时间(抱歉 ---我确实需要几个小时才能找到丢失的保留,因为错误会在不相关的时刻弹出,可能是在内存清理期间或之后)。

所以我有一些带有 c 样式数组的现有代码(比如UILabel* 的二维数组),在那里我可以很高兴地calloc() 指针并通过一些array[col*colstride+row*rowstride] 访问它们,其中@987654324 @ 是 UILabel ** 类型;假设UILabel*s 是按随机顺序填充的,所以我不能为此使用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() 中进行调试。

【问题讨论】:

  • 您应该将您的解决方案添加为答案,而不是将其附加到问题中。它更容易理解,并且可以链接到答案。

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


【解决方案1】:

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

解决方案

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

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

【讨论】:

    猜你喜欢
    • 2015-07-24
    • 2011-01-26
    • 1970-01-01
    • 2010-12-22
    • 2012-01-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多