Objective c ARC是否足够聪明,可以发布在超类中定义的子视图?

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中声明了共享属性,并在相应的类中声明了它们的唯一属性

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]
当我在ChildClass1ChildClass2中定义
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来说,这不是必需的。有什么想法吗?