首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >iPhone内存管理

iPhone内存管理
EN

Stack Overflow用户
提问于 2011-04-20 23:29:54
回答 4查看 294关注 0票数 1

我的应用程序在内存管理方面有问题。有些概念我是不明白的。例如,这段代码出了什么问题?我应该如何处理这个问题?

CustomController.h:

代码语言:javascript
复制
@interface CustomController : UIViewController <UIScrollViewDelegate>
{       
  IBOutlet UIScrollView  *scroll_view;
}

@property (nonatomic, retain) UIScrollView *scroll_view;

@end

CustomController.m:

代码语言:javascript
复制
@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

使用它:

代码语言:javascript
复制
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]);

和输出:

代码语言:javascript
复制
Controller: 1
ScrollView: 0

Controller: 2
ScrollView: 2

Controller: 1
ScrollView: 2

此时,当我从数组中移除控制器时,因为我不再需要它,所以scrollView在控制器的dealloc方法中的retainCount是2,并且内存没有被释放(scrollView有很多uiimageview没有被释放)。有人能帮帮忙吗?

编辑:

最后,问题是导航控制器保留了控制器视图。我使用控制器数组作为自定义导航的堆栈。在pop中,我从数组中删除了控制器,但导航控制器仍然保留了视图。从超级视图中删除它解决了这个问题,现在我的scrollView和它的所有子视图都被正确发布了!谢谢大家!

EN

回答 4

Stack Overflow用户

发布于 2011-04-20 23:33:29

IBOutlet的私有变量称为scroll_view,而属性称为m_scroll_view。

然后你需要告诉@@synthesize这个属性应该使用正确的私有变量:

代码语言:javascript
复制
@synthesize m_scroll_view =  scroll_view;

(编辑删除了此内容)

除了调用dealloc之外,您还应该在调用自己的方法之前先调用任何超级方法。

票数 0
EN

Stack Overflow用户

发布于 2011-04-20 23:48:49

代码语言:javascript
复制
@interface CustomController : UIViewController <UIScrollViewDelegate>
{       
  IBOutlet UIScrollView  *scroll_view;
}

@property (nonatomic, retain) UIScrollView *scroll_view;

ivar有一个比属性更好的名字,比如_scroll_view,这样你就可以知道哪个是哪个了。通常我在寻址属性时使用self.property,这样更容易看出它是一个属性,当它是ivar时使用_ivar。

代码语言:javascript
复制
@interface CustomController : UIViewController <UIScrollViewDelegate>
{       
  IBOutlet UIScrollView  *_scroll_view;
}

@property (nonatomic, retain) UIScrollView *scroll_view = _scroll_view;
票数 0
EN

Stack Overflow用户

发布于 2011-04-21 00:13:00

您的测试代码不会显示在您还将其从数组中删除后会发生什么。在这种情况下,控制器上的保留计数应该为0,滚动视图应该为1。我怀疑滚动视图仍然保留计数的原因是它仍然在视图层次结构中被引用。如果你删除了视图,那么它就应该被释放。

您还可以在滚动视图的保留消息中添加断点,以查看谁在保留它,并确保他们也释放了它。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5732855

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档