【问题标题】:How to release ViewController after pushviewcontrollerpushviewcontroller 后如何释放 ViewController
【发布时间】:2012-09-13 15:17:36
【问题描述】:

我有 2 个视图,名为 viewcontroller1,viewcontroller2。每个视图控制器都加载了大约 3 张图片(在 XIB 中加载),当我尝试使用 [self.navigationcontroller pushviewcontroller] 将 view1 推送到 view2 时,内存无法释放。(我想知道它无法释放 viewcontrler1 或无法释放 uiimageview )我的代码有任何错误吗?

viewcontroller1 代码如下:

viewcontroller1.h

@interface ViewController : UIViewController
@property(strong,nonatomic)IBOutlet UIImageView *mainImageView;
@property(strong,nonatomic)IBOutlet UIImageView *topwallImageView;
@property(strong,nonatomic)IBOutlet UIImageView *buttonImageView;

viewcontroller1.m

- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
}

- (void)viewDidUnload
{
self.mainImageView = nil;
self.topwallImageView = nil;
self.buttonImageView = nil;
[super viewDidUnload];
// Release any retained subviews of the main view.
}

-(void)dealloc
{
[mainImageView release];
[topwallImageView   release];
[buttonImageView release];
[super dealloc];
}

-(IBAction)main2ViewController:(id)sender
{
Main2ViewController *main2ViewController =[[Main2ViewController alloc]initWithNibName:@"Main2ViewController" bundle:nil];
[self.navigationController pushViewController:main2ViewController animated:NO];
[main2ViewController release];
}

【问题讨论】:

  • 问题可能还在于加载另一个视图控制器。或者它真的在你释放你的第二个视图控制器的那一行上崩溃了?您是否应用断点来跟踪其实际崩溃的位置?
  • @Apple_iOS0304 我的问题没有崩溃。是不能不释放视图控制器

标签: iphone memory-management uiimageview


【解决方案1】:

你必须更详细地学习iOS中的对象通信和内存管理。

另外请尝试使用 ARC。 自动引用计数 (ARC) 是在 iOS 5 sdk 中引入的,通过将内存管理作为编译器的工作,使 Objective-C 程序员不必处理内存管理。

您可以使用this link将您的项目转换为启用 ARC

当 viewcontroller2 可见或在推送 viewcontroller2 后,您不能释放 viewcontroller1 及其 IBOutlet 属性。因为您从 viewcontroller1 推送 viewcontroller2。viewcontroller1 是 viewcontroller2 的容器/父级。 没有 viewcontroller1,viewcontroller2 将不存在

关于IBOutlet imageview图片,可以设置为nil。例如:yourImageview.image = nil;但是不会释放IBOoutlet Imageview内存。

IBOutlet imageview 将在调用 viewcontroller1 的 release 方法时被释放,因为您在 viewcontroller1 的 dealloc 方法中正确释放了它:)

关于您的 Main2ViewController 方法:您在代码中正确处理了内存

当你调用 pushViewController 时,它会保留默认推送的控制器。请注意,您不是所有者。当控制器弹出时它会自动释放。但是你必须释放分配的 Main2ViewController。所以你的代码很好:)

【讨论】:

  • 谢谢 Ramshad,“不释放资源”是什么意思? (像这样:uiimageview.imageview = [uiimage imageconterfilepath:1.png])在我 pushviewcontroller view1 释放或不释放之后?我可以在 viewcontroller2 上释放 uiimageview 吗? BTW 如何弹出视图控制器?
  • 我已经尝试过你的代码“youImageview.image=nil”我不起作用。顺便说一句,我可以使用工具栏控制器来替换导航控制器吗?
  • youImageview.image=nil 不会释放 IBOoutlet 内存。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-15
  • 1970-01-01
相关资源
最近更新 更多