【问题标题】:View doesn't get released completely视图没有完全释放
【发布时间】:2012-08-08 08:52:45
【问题描述】:

如果这是一个愚蠢的问题,我深表歉意,但我对 iOS 开发非常陌生。那么问题来了:

当我将SecondView 添加到FirstView 时,内存已分配,但当我删除它时,并非所有分配的内存都被释放。

代码如下:

第一视图:

@interface FirstView : UIViewController
@property (nonatomic, retain) SecondView *secondView;
- (IBAction)loadSecondView;
@end

@implementation ViewController
@synthesize editView;
- (IBAction)loadSecondView{
    secondView = [[SecondView alloc]init];
    [self presentModalViewController:editView animated:YES];
}
- (void)viewWillAppear:(BOOL)animated{
    [secondView release]; secondView = nil; //this is called after SecondView is removed
}

第二视图:

@interface SecondView : UIViewController
@end

@implementation EditView
-(void)viewDidLoad{
    for (int intCounter = 0; intCounter < 10000; intCounter++){
        UIImageView *image = [[UIImageView alloc]init]; //create 10000 images just to fill up the memory
        [self.view addSubview:image];

        [image release]; image = nil;
    }
}
@end

以下是我从 Instruments (Live Bytes) 获得的一些数字:

  1. FirstView 已加载:671 KB
  2. 已加载第二视图:3.28 MB
  3. SecondView 已删除:809 KB

注意:仪器显示没有泄漏

Live 字节不应该成为初始值(671 KB)吗?剩下的是什么而不是 809 KB?

【问题讨论】:

  • 你为什么不使用arc?如果你这样做,你不应该担心释放东西。 (仅将指针设置为 nil,其余部分由操作系统处理)
  • 我刚刚将项目迁移到arc,仍然遇到同样的问题。
  • 有什么问题?没有泄漏意味着它是好的。一些内存可能用于缓存、单例等

标签: ios memory-management uiviewcontroller


【解决方案1】:

这不是泄漏。苹果缓存了一些细节。第一次加载视图控制器时,它会增加内存使用量。一旦你释放它,一些东西将保持缓存。

所以,第一次阅读不会给你确切的图片。

进行相同的练习 2-3 次。因此,您应该能够在第 3 次迭代开始和第 3 次迭代结束时拥有相同的内存利用率。

如果它在每个周期都增加,那么可能存在内存泄漏的情况。

【讨论】:

  • 这是否也适用于对象,例如按钮、标签……?
  • 没有。如果它们被分配了自动释放,那么你将不会立即生效。当自动释放池被销毁时,它将被添加到你的空闲内存中。
猜你喜欢
  • 1970-01-01
  • 2015-04-25
  • 2020-04-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-25
  • 1970-01-01
  • 2018-01-10
相关资源
最近更新 更多