@property, @synthesize и освобождение объектов в Objective-C - PullRequest
0 голосов
/ 03 мая 2011

Я занимаюсь разработкой игр для iPad.Я сталкиваюсь с этой вещью.Это мой пример кода:

Метод 1:

Foo.h

@interface Foo : UIView{
    UILabel *title;
    .... // Other objects like UISlider, UIbuttons, etc.
}

// I add @property for all the objects.
@property (nonatomic, retain) UILabel *title;

... blablabla

Foo.m
// I synthesize all the properties.
@synthesize title;
... blablabla

// Release in dealloc method
[title release];
....
[super dealloc];

Метод 2:

Foo.h

@interface Foo : UIView{
    UILabel *title;
    .... // Others object like UISlider, UIbuttons, etc.
}
// But this time I didn't add @property, synthesize and release.

Foo.m
// When I need the label, I allocate it:
title = [[UILabel alloc] initWithRect: CGRect(10, 10, 100, 30)];
title.text = @"test";
[self addSubview: title];
[title release];

Оба метода 1 и 2 работают, но в чем разница между 2методы (метод2 содержит меньше кода)?

Какой метод следует использовать и почему?

Это как-то связано с управлением памятью?

Ответы [ 2 ]

0 голосов
/ 03 мая 2011

Метод 2 технически некорректен, так как, отправляя -release в заголовок, вы указываете, что он вам больше не интересен. Вы должны сделать его равным nil сразу же, или, что еще лучше, сделать его локальной переменной.

Метод 1 абсолютно подходит и имеет то преимущество, что за пределами -dealloc при условии, что вы всегда используете свойство для ссылки на него, вам не нужно беспокоиться о получении -retain и -release -правильно.

0 голосов
/ 03 мая 2011

Разница в том, что в методе 2 у вас не будет доступа к заголовку извне объекта Foo. Переменные экземпляра являются частными для класса.

Кроме того, вам необходимо убедиться, что вы уравновешиваете выделение / сохранение и освобождение.

...