По-моему, вы предоставили класс с дополнительным кодом. Я постараюсь объяснить.
Прежде всего, в вашем предыдущем у вас есть два разных 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];
}
Надеюсь, это поможет.