繁体   English   中英

Objective-C保留问题

[英]Objective-C retain question

在Xcode中,我在按下UIViewController时有一个UINavigationController。

在该UIViewController中,我初始化一个UIScrollView。

都好。

但是,切换到另一个视图后,我记录了控制器的保留计数,但令我惊讶的是,它是1而不是0。

这是代码:

scroller = [[UIScrollView alloc] initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height)];

[self.view addSubview:scroller];

和:

- (void)dealloc {
    [super dealloc];

    NSLog(@"retaincount, %d", [scroller retainCount]);  //displays 2

    [scroller release];

    NSLog(@"retaincount, %d", [scroller retainCount]); // displays 1
}

我只将其初始化并将其添加到UIViewControllers视图。

亲切的问候,

汤姆

不要使用retainCount! 苹果文档

重要说明 :在调试内存管理问题时,此方法通常没有任何价值。 由于可能有许多框架对象保留了一个对象以保留对其的引用,而同时自动释放池可能会在一个对象上保留任何数量的延迟发布,因此从此获取有用信息的可能性很小方法。

要了解必须遵守的内存管理基本规则,请阅读“ 内存管理规则 ”。 要诊断内存管理问题,请使用合适的工具:

话虽如此:您必须在dealloc方法的最后一行调用[super dealloc] 除此之外,代码中的所有内容都应该可以。 不要尝试手动降低keepCount。 使用适当的内存管理。 同样,不要看retainCount。

并且,释放对象后,您将无法使用它。 如果由于您的版本而释放了滚动条,则第二个NSLog将导致BAD_ACCESS异常。

这就是为什么:

scroller = [[UIScrollView alloc] initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height)];
//retain count = 1

[self.view addSubview:scroller];
//retain count + 1 + 1 = 3

//later the AutoreleasePool decrements the count by 1, resulting in a retain count of 2.
  1. init…开头的方法返回保留值为1的非自动释放实例。
  2. 通过self.view:访问您的子视图self.view:将自动释放的保留指针返回到子视图。
  3. 通过addSubview:向视图添加子视图addSubview: 保留subview
  4. 通过removeFromSuperview:从其子视图中删除子视图removeFromSuperview: 释放它

但是,您不应依赖对象的保留计数。
相反,您必须注意使对象上的保留和释放调用保持平衡。
确保在此问题上阅读Apple的《 内存管理编程指南》 (尤其是规则部分 !)

self.view保留了它。 当你的UIViewController deallocs,它会释放self.view ,这将释放所有保留的子视图。 实际上,您可能应该在将它添加到self.view之后尽快发布它。

就是说,我坚决支持@fluchtpunkt的回答。 检查retainCount属性以查找调试信息只会导致混乱,并且在Stack Overflow上会导致越来越连贯和混乱的帖子。

先前的答案是正确的:请勿使用-retainCount,并确保您在自己的-dealloc实现中最后调用[super dealloc]

我想补充一下,您可能永远都不会看到-retainCount返回0的情况(不是您应该看的情况)。如果对象的keepCount下降为零,则对象将被释放。 实际上,似乎Cocoa甚至都不会费心将keepCount设置为零...-如果以前的keepCount为1,则-release似乎会取消分配对象。这是将-retainCount作为私有实现细节的又一个原因。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM