我不知道如何释放存储在老式 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()
的调试。