Objective c ARC是否足够聪明,可以发布在超类中定义的子视图?
我有一个自定义视图类,它是UITableViewCell的一个子类 我还有另外两个自定义视图类,它们继承自这个子类(它们共享许多相同的属性,但差异很大,足以保证独立的类) 我在MyParentCell中声明了共享属性,并在相应的类中声明了它们的唯一属性Objective c ARC是否足够聪明,可以发布在超类中定义的子视图?,objective-c,xcode4.2,automatic-ref-counting,Objective C,Xcode4.2,Automatic Ref Counting,我有一个自定义视图类,它是UITableViewCell的一个子类 我还有另外两个自定义视图类,它们继承自这个子类(它们共享许多相同的属性,但差异很大,足以保证独立的类) 我在MyParentCell中声明了共享属性,并在相应的类中声明了它们的唯一属性 UITableViewCell | | MyParentCell // defines propertyA and propertyB, both IBOutlet subviews / \ / \
UITableViewCell
|
|
MyParentCell // defines propertyA and propertyB, both IBOutlet subviews
/ \
/ \
/ \
| |
| ChildClass1 // defines propertyC, an IBOutlet subview
|
ChildClass2 // defines property D, an IBOutlet subview
我的问题是:因为我使用的是ARC,无法显式调用[super delloc]
当我在ChildClass1和ChildClass2中定义dealloc:
时,我必须释放它们在每个类中拥有的所有子视图,否则MyParentCell#dealloc还会被调用吗
i、 e
我是否必须写下以下内容:
// ChildClass1.m
@implementation ChildClass1
-(void)dealloc
{
self.propertyA = nil;
self.propertyB = nil;
self.propertyC = nil;
}
@end
// ChildClass2.m
@implementation ChildClass2
-(void)dealloc
{
self.propertyA = nil;
self.propertyB = nil;
self.propertyD = nil;
}
@end
或者写下以下内容就足够了:
// MyParentCell
@implementation MyParentCell
-(void)dealloc
{
self.propertyA = nil;
self.propertyB = nil;
}
@end
// ChildCell1.m
@implementation ChildCell1
-(void)dealloc
{
self.propertyC = nil;
}
@end
// ChildCell2.m
@implementation ChildCell2
-(void)dealloc
{
self.propertyD = nil;
}
@end
如果第二种方法很好,有人能解释何时以及如何调用MyParentCell#dealoc吗
如果第一种方法是必要的,那就糟透了:/根本不需要使用dealloc作为一般规则(但在某些情况下),将ain dealloc放在只显示dealloc字的NSLog中。运行并信任ARC一切都会自动发生您不必执行方法1或方法2。您根本不需要实现
dealloc
。解除分配子类的实例时,它保留的对象将自动释放。因此,如果它们没有保留在其他地方,它们也将被释放。当然,对于ARC,每个类都只负责清理自己的资源。如果在子类中定义dealloc,它将在方法末尾隐式调用父类的dealloc。你不必打字
如果您只是发布实例变量或属性,那么在整个dealloc链完成后,您可以依靠ARC来为您执行此操作。ARC以静默方式实现
.cxx_destruct
,该函数从NSObject的dealloc调用,并负责释放类中的任何强函数。仅当在viewDidUnload中使用.xib和IBOutlets时,仍然建议将self.property设置为nil,在您的情况下,它肯定是不需要的。尽管您担心ARC是否真的为零,但这个属性是可以理解的:)我正在将一个自定义xib文件加载到一个表中-据我所知,ViewDiUnload
是一个UIViewController事件,因此在自定义子视图的情况下不会被调用。这是否意味着我根本不必担心将它的子视图设置为nil?你是对的-我的观点是,仍然建议将settomg设置为nil。在您的情况下,它是不需要的。确定-感谢您的建议:)确定-因此,即使属性属性是强属性,也不太可能存在任何共享所有权,因此当父视图为时,它会自动解除分配?共享所有权是什么意思?另一个UIView子类实例具有强(保留)属性相同属性的所有权-我想在子视图的情况下,如果没有一些非常糟糕的编码,这是不可能发生的-谢谢你的解释-我现在知道dealloc也将在超类中调用,所以我不必担心这样做。我一直认为每个班级都应该清理自己的资源,但这篇文章上的其他评论说,对于ARC来说,这不是必需的。有什么想法吗?