我的应用程序在内存管理方面有问题。有些概念我是不明白的。例如,这段代码出了什么问题?我应该如何处理这个问题?
CustomController.h:
@interface CustomController : UIViewController <UIScrollViewDelegate>
{
IBOutlet UIScrollView *scroll_view;
}
@property (nonatomic, retain) UIScrollView *scroll_view;
@endCustomController.m:
@implementation CustomController
@synthesize scroll_view;
- (void)viewDidLoad
{
[self setup_content];
[super viewDidLoad];
}
- (void) setup_content
{
// Fill the scrollview with some subviews
}
- (void)didReceiveMemoryWarning {
// Releases the view if it doesn't have a superview.
[super didReceiveMemoryWarning];
// Release any cached data, images, etc that aren't in use.
}
- (void)viewDidUnload
{
[scroll_view release];
scroll_view = nil;
[super viewDidUnload];
// Release any retained subviews of the main view.
// e.g. self.myOutlet = nil;
}
- (void)dealloc
{
[scroll_view release];
[super dealloc];
}
@end使用它:
CustomController *custom_controller = [[CustomController alloc] initWithNibName: @"CustomController" bundle: nil];
NSLog(@"Controller: %i", [custom_controller retainCount]);
NSLog(@"ScrollView: %i", [custom_controller.scroll_view retainCount]);
[controllersArray addObject: custom_controller];
NSLog(@"Controller: %i", [custom_controller retainCount]);
NSLog(@"ScrollView: %i", [custom_controller.scroll_view retainCount]);
[custom_controller release];
NSLog(@"Controller: %i", [custom_controller retainCount]);
NSLog(@"ScrollView: %i", [custom_controller.scroll_view retainCount]);和输出:
Controller: 1
ScrollView: 0
Controller: 2
ScrollView: 2
Controller: 1
ScrollView: 2此时,当我从数组中移除控制器时,因为我不再需要它,所以scrollView在控制器的dealloc方法中的retainCount是2,并且内存没有被释放(scrollView有很多uiimageview没有被释放)。有人能帮帮忙吗?
编辑:
最后,问题是导航控制器保留了控制器视图。我使用控制器数组作为自定义导航的堆栈。在pop中,我从数组中删除了控制器,但导航控制器仍然保留了视图。从超级视图中删除它解决了这个问题,现在我的scrollView和它的所有子视图都被正确发布了!谢谢大家!
发布于 2011-04-20 23:33:29
IBOutlet的私有变量称为scroll_view,而属性称为m_scroll_view。
然后你需要告诉@@synthesize这个属性应该使用正确的私有变量:
@synthesize m_scroll_view = scroll_view;(编辑删除了此内容)
除了调用dealloc之外,您还应该在调用自己的方法之前先调用任何超级方法。
发布于 2011-04-20 23:48:49
@interface CustomController : UIViewController <UIScrollViewDelegate>
{
IBOutlet UIScrollView *scroll_view;
}
@property (nonatomic, retain) UIScrollView *scroll_view;ivar有一个比属性更好的名字,比如_scroll_view,这样你就可以知道哪个是哪个了。通常我在寻址属性时使用self.property,这样更容易看出它是一个属性,当它是ivar时使用_ivar。
@interface CustomController : UIViewController <UIScrollViewDelegate>
{
IBOutlet UIScrollView *_scroll_view;
}
@property (nonatomic, retain) UIScrollView *scroll_view = _scroll_view;发布于 2011-04-21 00:13:00
您的测试代码不会显示在您还将其从数组中删除后会发生什么。在这种情况下,控制器上的保留计数应该为0,滚动视图应该为1。我怀疑滚动视图仍然保留计数的原因是它仍然在视图层次结构中被引用。如果你删除了视图,那么它就应该被释放。
您还可以在滚动视图的保留消息中添加断点,以查看谁在保留它,并确保他们也释放了它。
https://stackoverflow.com/questions/5732855
复制相似问题