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