Управление памятью iPhone - PullRequest
       6

Управление памятью iPhone

1 голос
/ 20 апреля 2011

У меня проблемы с управлением памятью в приложении.Есть некоторые понятия, которые я не понимаю.Например, что не так с этим кодом?Как мне решить эту проблему?

CustomController.h:

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

@property (nonatomic, retain) UIScrollView *scroll_view;

@end

CustomController.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

В этот момент, когда я удаляю контроллер из массива, потому что он мне больше не нужен, retainCount, который scrollView имеет в методе dealloc контроллера, равен 2, а памятьне освобождается (scrollView имеет много uiimageviews, которые не выпускаются).Кто-нибудь может помочь, пожалуйста?

Редактировать:

Наконец проблема заключалась в том, что представление контроллеров было сохранено навигационным контроллером.Я использовал массив контроллеров в качестве стека для пользовательской навигации.Во всплывающем окне я удалял контроллер из массива, однако навигационный контроллер все еще сохранял представление.Удаление его из superview решило проблему, и теперь мой scrollView и все подпредставления, которые он имеет, были выпущены правильно!Спасибо всем!

Ответы [ 4 ]

0 голосов
/ 20 апреля 2011

controllersArray по-прежнему хранит ваш custom_controller, т. Е. Число сохранений равно 1. Когда вы удаляете этот объект из массива, он должен опуститься до 0, а затем скроллер будет освобожден.

, поэтому вам следует попробовать[controllersArray removeObject: custom_controller], когда вы закончите с ним.при условии, что controllersArray - это, конечно, NSMutableArray.

0 голосов
/ 20 апреля 2011
@interface CustomController : UIViewController <UIScrollViewDelegate>
{       
  IBOutlet UIScrollView  *scroll_view;
}

@property (nonatomic, retain) UIScrollView *scroll_view;

хорошо иметь другое имя для ивара, чем свойство, например _scroll_view, таким образом, вы можете увидеть, что есть что. Обычно я использую self.property при обращении к свойствам, чтобы легче было видеть, что это свойство, и использую _ivar, когда это ivar.

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

@property (nonatomic, retain) UIScrollView *scroll_view = _scroll_view;
0 голосов
/ 20 апреля 2011

Ваш тестовый код не показывает, что происходит после того, как вы также удалите его из массива. В этом случае счетчик сохранений на контроллере должен перейти в 0, а просмотр прокрутки должен быть в 1. Я подозреваю, что причина, по которой у прокрутки будет сохраняться счет, состоит в том, что на него все еще ссылаются в иерархии представлений. Если вы удалите представление, оно должно быть освобождено.

Вы также можете добавить точку останова в сообщение сохранения для просмотра прокрутки, чтобы увидеть, кто его хранит, и убедиться, что они также освобождают его.

0 голосов
/ 20 апреля 2011

Ваша личная переменная для IBOutlet называется scroll_view, а свойство - m_scroll_view.

Затем вам нужно будет сказать @@ synthesize, что свойство должно использовать правильную личную переменную:

@synthesize m_scroll_view =  scroll_view;

(Редактирование убрало это)

Вы должны также сначала вызвать любые супер-методы перед вызовом своих собственных, кроме случаев вызова dealloc.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...