Метод класса для возврата объекта с автоматическим освобождением

Я слежу за видео о разработке iPhone в iTunes U, и пока все хорошо. Думаю, я достаточно хорошо все понял.

Дело в том, что в примерах, которые они предоставляют, они никогда не создают собственные методы класса, такие как те, которые вы используете в некоторых классах Foundation (например, [строка NSString]), поэтому я не уверен, как мне следует создать свой собственный метод класса. чтобы вернуть автоматически выпущенный экземпляр моего класса.

Я знаю, как создать сохраненный объект с помощью метода экземпляра, но я бы предпочел использовать метод класса, потому что я предпочитаю его, я просто не уверен, будет ли эта реализация наиболее подходящей для возврата автоматически выпущенного объекта:

+ (PhotoViewController*)initWithImageView:(UIImageView*)imageView
{
    PhotoViewController *toreturn = [[PhotoViewController alloc] init];
    toreturn.imageview = imageView;
    [toreturn autorelease];
    return toreturn;
}

Большое спасибо за любую помощь, которую вы можете предоставить.


person João Josézinho    schedule 08.02.2011    source источник


Ответы (2)


Метод класса может возвращать как сохраненный, так и автоматически освобожденный объект по вашему желанию, и ваш код вполне уместно возвращает автоматически освобожденный объект.

Однако вам, вероятно, следует назвать свой метод по-другому. Поскольку ваш метод начинается с init, это означает, что он инициализирует объект alloced (и поэтому должен быть методом экземпляра, а не методом класса). Я бы предложил назвать метод photoViewControllerWithImageView:, если он будет возвращать автоматически выпущенный объект.

Кроме того, я бы, вероятно, написал это как return [toreturn autorelease];, но я думаю, что это мой стиль предпочтения.

person paulbailey    schedule 08.02.2011
comment
Я думаю, он спрашивает, использует ли он право на сохранение и освобождение, и вы, кажется, отвечаете на все вопросы, кроме этого :) - person Nikita Rybak; 08.02.2011
comment
Методы класса вообще не должны иметь префикс init, но рекомендации Apple охватывают только имена методов, которые начинаются с alloc или new или содержат слово copy. - person jlehr; 08.02.2011
comment
Вы совершенно правы, спасибо! Я соответствующим образом изменю свой ответ. - person paulbailey; 08.02.2011
comment
Большое спасибо за ваш вклад. Мне также нравится следовать соглашениям (они кажутся важными в этой области управления памятью), поэтому ваше предложение относительно названия метода важно, потому что я не знал об этом. - person João Josézinho; 08.02.2011
comment
Стандартом для возврата автоматически выпущенных объектов из конструктора класса должна быть форма clasaNameInitializer. Итак, в вашем примере это должно выглядеть так: +(PhotoViewController*)photoViewControllerWithImageView:(UIImageView*)imageView; - person LightningStryk; 24.04.2013

Я думаю, что это хорошая практика, чтобы проверить, является ли toreturn nil или нет, прежде чем обращаться к свойству imageview.

person MHC    schedule 08.02.2011
comment
Почему в данном случае это имеет какое-то значение? - person jlehr; 08.02.2011
comment
Нет, не будет. Но мой опыт говорит, что лучше четко указать в коде, каким будет возвращаемое значение, особенно код будет поддерживаться намного позже, возможно, кем-то другим. Но другие могут не согласиться. Извините, я не ясно выразился об этом в ответе. - person MHC; 08.02.2011
comment
Все равно не понятно, к чему ты клонишь. Если вызов init завершается ошибкой, метод возвращает nil, как и должно быть. Что бы вы сделали по-другому? - person jlehr; 08.02.2011
comment
Для меня это напоминание со-программистам (или мне в будущем), что возврат init может быть nil, для случая, когда что-то добавляется внутри этой функции. Ну... может быть, это совершенно ненужно, если проект предназначен только для Objective-C. Это похоже на мою привычку, и спасибо, что дали мне шанс подумать об этом еще раз. - person MHC; 08.02.2011
comment
Я понимаю, что вы имеете в виду, говоря об использовании дополнительного кода для облегчения чтения, но не могли бы вы пояснить, как может произойти сбой init (если вам не хватило памяти?)? - person João Josézinho; 08.02.2011
comment
Хорошо, теперь я понимаю (можно реализовать его один метод инициализации). - person João Josézinho; 08.02.2011