Проблема управления памятью iOS - PullRequest
0 голосов
/ 29 января 2012

Когда вы используете функцию Xcode и перетаскиваете из файла пера в файл .h и .m, Xcode добавляет код в dealloc и viewDidUnload. Это добавляет дополнительный код, который я обычно не добавляю. Мне просто любопытно, нужен ли этот дополнительный код.

Я бы сделал [self setDisplaySlider:nil], а не disp = nil и [disp release].

Это необходимо? Я не думаю, что вы должны отпустить дисп.

@interface ViewController : UIViewController
{
   IBOutlet UISegmentedControl *disp;    
}

@property (retain, nonatomic) IBOutlet UISegmentedControl *displaySlider;

@end

- (void)viewDidUnload
{
    [self setDisplaySlider:nil];
    [disp release];
    disp = nil;
    [super viewDidUnload];
}

- (void)dealloc {
    [displaySlider release];
    [disp release];
    [super dealloc];
}

Ответы [ 2 ]

3 голосов
/ 30 января 2012

По-моему, вы предоставили класс с дополнительным кодом. Я постараюсь объяснить.

Прежде всего, в вашем предыдущем у вас есть два разных IBOutlet. Я думаю, что первый из них был добавлен вами.

IBOutlet UISegmentedControl *disp;

Второй, вместо этого, был добавлен Xcode при выполнении операции перетаскивания.

@property (retain, nonatomic) IBOutlet UISegmentedControl *displaySlider;

Первое рассмотрение

Термин IBOutlet является только заполнителем для Xcode. Благодаря этому Xcode помогает вам подключить переменную экземпляра к графическому элементу.

Когда я использую розеточные соединения, я обычно поставляю аксессор, например @property (retain, nonatomic) IBOutlet UISegmentedControl *displaySlider; (как это сделал Xcode), потому что в противном случае вы можете столкнуться с проблемами утечки памяти.

Второе рассмотрение

Код, предоставленный Xcode, верен. Когда вы выполнили операцию перетаскивания, вы связали переменную экземпляра displayController с вашим графическим элементом. Чтобы сбалансировать это соединение, переменная экземпляра должна быть освобождена в методе dealloc следующим образом:

[displayController release];

В зависимости, Xcode добавил [self setDisplaySlider:nil];, потому что в ситуациях с предупреждением памяти может быть вызван метод viewDidUnload. Здесь нет проблем, потому что когда контроллер снова загружен в память, выходное соединение восстанавливается.

Разницу между двумя вызовами методов можно прочитать в Расширенное управление памятью doc и release-or-set-to-nil-retained-members . Обратите внимание, что если вы сделаете это:

[displayController release];

вы напрямую обращаетесь к переменной вашего экземпляра с именем displayController, а если вы делаете это:

[self setDisplaySlider:nil]; // or self.displaySlider = nil;

Вы обращаетесь к методу доступа (в данном случае к методу сеттера) для этой переменной экземпляра. Это не то же самое (во избежание путаницы смотрите код, который я предоставил).

Итак, этот код я бы использовал (я добавил несколько комментариев, чтобы помочь вам):

//.h
@interface ViewController : UIViewController
{
    UISegmentedControl *disp; // instance variable called disp
    // (A) now this is no longer necessary, new compile mechanism will create an instance
    // variable called _displaySlider under the hood
}

@property (retain, nonatomic) IBOutlet UISegmentedControl *displaySlider;

@end

//.m
@synthesize displaySlider = disp;  // I say to Xcode to create a setter and a getter to access the instance variable called disp as written in @property directive
// no longer necessary for (A)

- (void)viewDidUnload
{
    [super viewDidUnload];        
    [self setDisplaySlider:nil]; // I call the setter method to release the UISegmentedControl
}

- (void)dealloc {
    [disp release]; // I release the UISegmentedControl directly
    // if you choose the (A) mechanism simply do
    // [_displaySlider release];
    [super dealloc];
}

Надеюсь, это поможет.

0 голосов
/ 29 января 2012

Посмотрите на ваше viewDidLoad: Я думаю, вы обнаружите, что объекты размещаются там.

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

...