Xcode путаница - собственность и синтезировать, сохранить? - PullRequest
0 голосов
/ 02 октября 2011

Я вижу, как используется свойство и синтезируется без «объявления переменной» вначале ... и я немного запутался в том, какие свойства использовать.Я хочу выделить и запустить свой viewController в AppDelegate, а затем быть уверенным, что он существует до конца выполнения.Ясно, что я хочу retain-property? .. однако .., так как alloc возвращает viewController с retain count 1, он выглядит намного умнее, если просто использовать опустить retain-свойство.Никакой другой класс не будет использовать мой сеттер, так что мне все равно?

Пример.

в AppDelegate.h:

    @propert(nonatomic,retain) MyViewController *myViewController;

в AppDelegate.m:

    @synthesize myViewController = _myViewController;
    - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
    {
        self.myViewController = [[[EventDataController alloc] init] autorelease];
        [self.window makeKeyAndVisible];
        return YES;
    }

или ..

в AppDelegate.h:

    @propert(nonatomic) MyViewController *myViewController;

в AppDelegate.m:

    @synthesize myViewController = _myViewController;
    - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
    {
        self.myViewController = [[EventDataController alloc] init];
        [self.window makeKeyAndVisible];
        return YES;
    }

Поставьте меня прямо, пожалуйста.

Ответы [ 3 ]

3 голосов
/ 02 октября 2011

Вам больше не нужно определять переменные экземпляра для свойств - @synthesize делает это за вас.

Что касается вашего другого вопроса - вы можете сделать это в любом случае, но не забудьте отпуститьэто в вашем -dealloc.Мне нравится (nonatomic, retain), потому что он очень понятен и прост в использовании / понимании.Все, что вы делаете, это назначаете, и он делает все остальное:

self.myViewController = [[[ViewController alloc] init] autorelease];

В вашем -dealloc:

self.myViewController = nil;

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

@interface MyClass: NSObject
{
  ViewController* _myViewController;
}
@end

В вашей реализации:

_myViewController = [[ViewController alloc] init];

В вашей -dealloc:

[_myViewController release];
_myViewController = nil;

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

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

1 голос
/ 02 октября 2011

Я бы пошел с первым вариантом.

Почему вы не можете явно отпустить myViewController, когда закончите с этим?

Я бы не стал делать предположения типа "этот класс никогда не будет использоваться кем-либо еще".

0 голосов
/ 02 октября 2011

вариантов, я предпочитаю объявлять свойство с retain. это документация ради вас, и она может уберечь вас от глупых ошибок благодаря таким инструментам, как статический анализ. поскольку ваш класс владеет контроллером, следует объявить, что он содержит ссылку на него, независимо от деталей реализации. отклонение от обычных идиом - это хороший способ ввести ошибки. Вы также должны объявить его как readonly.

...