为啥这个 ImageView 没有被释放?

Posted

技术标签:

【中文标题】为啥这个 ImageView 没有被释放?【英文标题】:Why is this ImageView not being released?为什么这个 ImageView 没有被释放? 【发布时间】:2011-04-23 21:33:18 【问题描述】:

我有一个在应用启动时显示的启动页面,我的客户希望我在 x 时间内保持可见。除了图像从未发布外,一切都很好?

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions     

    NSString *fileLocation = [[NSBundle mainBundle] pathForResource:@"splash_page" ofType:@"png"];

    NSData *imageData = [[NSData alloc] initWithContentsOfFile:fileLocation];
    UIImage *launchImage = [[UIImage alloc] initWithData:imageData];
    [imageData release], imageData = nil;

    UIImageView *launchImageView = [[UIImageView alloc] initWithImage:launchImage];
    launchImageView.frame = CGRectMake(0, 
        0, 
        [[UIScreen mainScreen] bounds].size.width , 
        [[UIScreen mainScreen] bounds].size.height);
    launchImageView.tag = 121;
    [launchImage release], launchImage = nil;

    [self.window addSubview:launchImageView];
    [launchImageView release], launchImage = nil;   

    [self.window makeKeyAndVisible];    
    [self performSelector:@selector(initApp) withObject:nil afterDelay:kInitDelay];

    return YES;


- (void)initApp

    [[UIApplication sharedApplication] setStatusBarHidden:NO];

    UIImageView *launchImageView = (UIImageView*)[self.window viewWithTag:121];
    [launchImageView removeFromSuperview];

    RootNavController *navController = [[RootNavController alloc] initRootController];
    self.rootNavController = navController;
    [self.window addSubview:navController.view];
    [navController release], navController = nil;

据我了解,removeFromSuperview 会在视图上调用 release,因此应该将其释放,但是我仍然可以在 Intruments 对象分配工具中看到 524kb 的 Malloc,我确定这是图像。责任库 = libRIP.A.dylib 和责任调用者 ripl_Create。

如果我注释掉启动页面代码并直接启动 NavController,我就没有 524kb。

有什么想法吗?

【问题讨论】:

如果您只注释掉[self.window addSubview:launchImageView] 行,它还有524kb 吗?您是否检查过以确保 [self.window viewWithTag:121] 实际上正在返回图像视图而不是由于某种原因而不是 nil? 如果您从模拟器的硬件菜单中执行“模拟内存警告”,内存是否会消失?我在想 UIKit 可能会缓存它以备将来使用,直到需要内存 @Anomie 如果我注释掉那一行,我仍然有 524kb,因为即使我没有将它添加到窗口中,我仍在初始化它。如果我从设置字符串开始注释掉整个部分,那么 524kb 将不再显示 obv。另外,我在初始化之后立即打印出 launchImageView 的地址,并在使用 viewWithTag 再次获取它并且它指向相同的地址之后? @Cory 我也认为它可能是缓存,这就是为什么我最终使用设置图像的方法而不是使用 imageNamed 的原因。但是,即使我模拟了内存警告,它也不会被释放? @HenryH:如果你完全删除launchImageView 的分配(只是将变量初始化为nil,如果需要也跳过addSubview)怎么样?或者launchImage 也一样? 【参考方案1】:

为什么不使用 Default.png 作为启动画面?将“Splash_page.png”重命名为“Default.png”将在加载时自动显示启动页面,然后只需将 UIImageView(带有 Default.png)添加到 MainWindow 并在 x 次后启动您的 rootViewController。

【讨论】:

以上是关于为啥这个 ImageView 没有被释放?的主要内容,如果未能解决你的问题,请参考以下文章

为啥在释放对象后使用'nil'

为啥 ImageView 通过增加边距顶部尺寸变小?

android编程 在image中为啥给图片定了大小(PX),background的大小也被缩放啦!和图片的大小一样

为啥 NSMutableArray 元素没有被释放?

为啥我的自动释放对象没有被释放?

为啥我的 ImageView 没有做任何事情,至少没有重绘?