【发布时间】: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() 中)。在试图理解这个问题时,我有一小部分对象,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() 中进行调试。
【问题讨论】:
-
您应该将您的解决方案添加为答案,而不是将其附加到问题中。它更容易理解,并且可以链接到答案。
标签: iphone ios5 xcode4.2 automatic-ref-counting