0

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

viewcontroller1 代码就像这样:

视图控制器1.h

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

视图控制器1.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];
}
4

1 回答 1

0

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

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

您可以使用此链接将您的项目转换为启用 ARC

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

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

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

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

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

于 2012-09-21T08:13:10.630 回答