我有一个手动参考计数项目,其中几个类我通过删除保留,释放和放大器转换为ARC。等,并通过设置编译器标志“-fobjc-arc” 它们是2个ARC(-fobjc-arc)启用的视图控制器类,ClassA和ClassB。
我在for循环中为ClassA分配和初始化ClassB的对象以实现某些功能,Code snippet如下所示,
@interface ClassA ()
@property (strong, nonatomic) ClassB *classBObj;
@end
@implementation ClassA
- (void)createClassBView {
for (int count = 0; count <= [dataObject count]; count++) //if count is more than 1 it is not retaining the previous classBObj
{
classBObj = [[ClassB alloc] init]; //ARC is keeping only 1 object reference of this class but I need to retain all the iterated objects
[self.scrollView addSubView:classBObj withFrame:myFrame];//only 1 view is getting added as subview even if control comes here more than once
}
}
@end
以上代码在非ARC(MRC)中适用于我,但在启用ARC时无法正常工作。即使它很强,它也不会保留ClassB对象,
只有1个对象,最后一次迭代的ClassB对象引用是活动的,其余的被破坏,它正在抛出异常&#34; ClassB引用一个解除分配的实例&#34;
我尝试使用if(!classBObj){classBObj = [[ClassB alloc] init];}
内部循环,那时我没有获得对已释放的实例异常的ClassB引用,但只有1个ClassB子视图被添加到我的scrollview(即最后一次迭代)。
请指导我。 任何帮助都提前感谢。
答案 0 :(得分:3)
您的代码完全按照您的要求执行操作。您在循环中一遍又一遍地将相同的引用self.classBObj
设置为ClassB实例。每次循环时,先前分配的self.classBObj
的现有ClassB实例都需要“退出”#34;这样就可以将新的一个分配给self.classBObj
。因此,当它被新的替换时它正确地被释放 - 正确地说,因为现在没有它的参考。
事实是,你在ARC之前完全管理不当内存,并且采用ARC已经揭示了这一事实。您的代码曾经工作过(或者似乎)。如果要维护多个ClassB实例,则需要将实例变量作为数组,而不是单个。
(另一方面,如果classBObj
是UIView并且要作为子视图立即添加到界面中,那仍然会发生,因此很难看到您的投诉是什么。事实上,奇怪的部分是为什么你需要classBObj
首先成为一个属性;为什么它不仅仅是一个局部变量?它不像你需要这些引用要保留在其他位置,因为您 这些引用 - 作为self.scrollView
的子视图。但是如果您需要这些引用用于以后的目的,并且如果您没有&#39;我想通过使用它们是滚动视图的子视图来获取它们,然后显然你需要它们的数组,正如我刚才所说。)