iPhone内存管理

iPhone内存管理,iphone,objective-c,cocoa-touch,memory-management,Iphone,Objective C,Cocoa Touch,Memory Management,我的应用程序内存管理有问题。有些概念我不明白。例如,此代码有什么问题?我应该如何处理这个问题 CustomController.h: @interface CustomController : UIViewController <UIScrollViewDelegate> { IBOutlet UIScrollView *scroll_view; } @property (nonatomic, retain) UIScrollView *scroll_view;

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

CustomController.h:

@interface CustomController : UIViewController <UIScrollViewDelegate>
{       
  IBOutlet UIScrollView  *scroll_view;
}

@property (nonatomic, retain) UIScrollView *scroll_view;

@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方法中的重新计数为2,并且内存没有被释放(scrollView有很多UIImageView没有被释放)。有人能帮忙吗

编辑:


最后,问题是导航控制器保留了控制器视图。我使用控制器阵列作为自定义导航的堆栈。在弹出窗口中,我正在从阵列中移除控制器,但视图仍由导航控制器保留。将其从superview中删除可修复此问题,现在我的scrollView及其所有子视图都已正确发布!谢谢大家

IBOutlet的私有变量称为scroll\u view,而属性称为m\u scroll\u view

然后您需要告诉@synthesis属性应该使用正确的私有变量:

@synthesize m_scroll_view =  scroll_view;
(编辑删除了此项)

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

@interface CustomController:UIViewController
@interface CustomController : UIViewController <UIScrollViewDelegate>
{       
  IBOutlet UIScrollView  *scroll_view;
}

@property (nonatomic, retain) UIScrollView *scroll_view;
{ IBOUTLE UIScrollView*滚动视图; } @属性(非原子,保留)UIScrollView*滚动视图;
最好为ivar使用另一个名称,而不是属性,例如“滚动视图”,这样您可以看到哪个是哪个。通常我在寻址属性时使用self.property,这样更容易看到它是一个属性,在它是一个ivar时使用_ivar

@interface CustomController : UIViewController <UIScrollViewDelegate>
{       
  IBOutlet UIScrollView  *_scroll_view;
}

@property (nonatomic, retain) UIScrollView *scroll_view = _scroll_view;
@接口自定义控制器:UIViewController
{       
IBOUTLE UIScrollView*_scroll_view;
}
@属性(非原子,保留)UIScrollView*scroll\u view=\u scroll\u view;

您的测试代码不会显示将其从阵列中删除后发生的情况。在这种情况下,控制器上的保留计数应变为0,滚动视图应变为1。我怀疑scrollview仍有保留计数的原因是它仍在视图层次结构中被引用。如果删除该视图,则应取消分配该视图


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

controllersArray仍然保留您的自定义\u控制器,即retain计数为1。 当您从数组中删除该对象时,它应该降到0,然后滚动条将被释放

因此,您应该在完成后尝试[controllersArray removeObject:custom_controller]。
当然,假设controllersArray是NSMutableArray。

不要调用retainCount。它对于调试这类东西几乎是无用的。谢谢你的建议,我将在我的代码中更改它。了解良好实践总是很好的。谢谢,当我将CustomController从数组中移除并调用dealloc方法时,CustomController被正确释放。问题在于scrollView在发布后有一个1的重新计数。scrollView是否可以从程序中的其他地方保留?U还可能会覆盖retain方法以进行测试和调试,以查看是谁调用它。通过这种方式,您可以查看是否有其他对象保留了您的滚动视图。上面的代码中可能没有显示的另一件事是,您在scrollview上放置的一个视图可能也保留了它。试着不要在它上面放任何东西,看看它是否被释放,然后你就会知道它是它的子视图之一。谢谢你,正如你所指出的,这个卷轴似乎在层次结构中被引用。我要这样走。
@interface CustomController : UIViewController <UIScrollViewDelegate>
{       
  IBOutlet UIScrollView  *_scroll_view;
}

@property (nonatomic, retain) UIScrollView *scroll_view = _scroll_view;