создание объекта и установка сохраняющего свойства - PullRequest
1 голос
/ 15 июля 2011

Как мне установить сохраняемое свойство при создании объекта с использованием alloc и init?( Без использования автоматического выпуска )

С этой строкой в ​​заголовке (и соответствующей строкой @synthesize в реализации):

@property(retain)UIWebView *webView;

Это три варианта Iиметь (я думаю):


UIWebView *tempWebView = [[UIWebView alloc] init];
[tempWebView setDelegate:self];
tempWebView.hidden = YES;
self.webView = tempWebView;
[tempWebView release];

(этот, кажется, лучший в отношении управления памятью, но он содержит больше строк кода и включает в себя глупое имя переменной, поэтому снижение читабельности)


self.webView = [[UIWebView alloc] init];
[self.webView release];
[self.webView setDelegate:self];
self.webView.hidden = YES;

(на этот раз более очевидно, что происходит, но управление памятью выглядит не очень хорошо, и анализатору Xcode это не нравится)


webView = [[UIWebView alloc] init];
[self.webView setDelegate:self];
self.webView.hidden = YES;

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


Так какой пример следует использовать или есть лучший способ?

1 Ответ

1 голос
/ 15 июля 2011

Лучшим вариантом, IMO, является тот, который вам не нравится, то есть с использованием автоматического выпуска:

 self.webView = [[[UIWebView alloc] init] autorelease];

Если вы не хотите и хотите инициализацию в одну строку, единственной опцией является вашатретий:

 webView = [[UIWebView alloc] init];

, так как всем остальным требуется явная строка для дополнительного релиза.

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

Что действительно хорошо работает с сохраненными свойствами, так это конструкторы удобства, такие как:

self.image = [UIImage imageWithContentsOfFile:xxxxxxx];

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

self.webView = [UIWebView webViewWith......];
...