Основной вопрос о семантике сохранения / выпуска из справочной библиотеки Apple - PullRequest
0 голосов
/ 11 апреля 2010

Я делал Objective-C еще тогда, и недавно (т.е. только сейчас) прочитал документацию на сайте Apple относительно использования retain и release. Однако на их странице создания приложения для iPhone есть немного кода, который немного смущает меня:

- (void)setUpPlacardView
{
    // Create the placard view -- it calculates its own frame based on its image.
    PlacardView *aPlacardView = [[PlacardView alloc] init];
    self.placardView = aPlacardView;
    [aPlacardView release];  // What effect does this have on self.placardView?!
    placardView.center = self.center;
    [self addSubview:placardView];
}

Не видя весь класс, кажется, что self.placardView также является PlacardView *, и присвоение ему aPlacardView, похоже, не означает, что оно сохранит ссылку на него. Таким образом, мне кажется, что строка, которую я прокомментировал ([aPlacardView release];), может привести к тому, что aPlacardView будет иметь счет сохранения 0 и, таким образом, будет освобожден. Так как self.placardView указывает на это, не будет ли это теперь указывать на освобожденную память и вызывать проблему?

Ответы [ 2 ]

3 голосов
/ 11 апреля 2010

Я сделал Objective-C, когда,

Привет, Obj-C ввел (злую) концепцию свойств . Обратите внимание, что

 self.placardView=xxx;

и

 self->placardView=xxx;

отличается. Первый по определению вызывает [self setPlacardView:xxx], тогда как второй просто присваивает xxx члену. Теперь, когда вы смотрите на MoveMeView.h , вы видите строку

@property (nonatomic, retain) PlacardView *placardView;

и MoveMeView.m

@synthesize placardView;

Они говорят компилятору генерировать -setPlacardView: и placardView соответствующим образом, используя стандартную семантику сохранения / выпуска. Для получения дополнительной информации см. Документацию Apple для properties .

1 голос
/ 11 апреля 2010

Пара вещей, на которые стоит обратить внимание;

если свойство placardView определено как сохраняемое (@property (retain) ...), то self.placardView вызовет установщик, сгенерированный компилятором, который будет включать сохранение.

Просто если это ново для вас, свойства и связанный @synthesize сообщают компилятору генерировать - (void)setPlacardView:(UIView *)view и - (UIView *)placardView методы.

Еще одна вещь, которую стоит отметить; addSubview: сохраняет представление, которое ему дано. Таким образом, без выпуска представление будет иметь счет сохранения 2. Выпуск, а затем добавление в качестве подпредставления дает счет сохранения 1.

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