viewDidLoad против методов appDelegate - PullRequest
1 голос
/ 25 августа 2011

Я по-прежнему немного озадачен тем, когда помещать что-либо в viewController и когда помещать это в AppDelegate, и если можно ссылаться на методы viewController из AppDelegate (я знаю, что вы можете но это не значит, что поощряется ).

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

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

Один из моих главных вопросов касается того, как представление viewcontroller взаимодействует с фоновыми состояниями. Если приложение возобновляет работу из фона, и представление немедленно появляется без загрузки, тогда я предполагаю, что оно все еще находится в памяти, и я убедился, что viewDidLoad не был вызван с базовым NSLog. Итак, можно ли с уверенностью сказать, что все без исключения объекты, сохраненные моим viewcontroller (например, модели данных и все подпредставления), по-прежнему находятся в памяти? Если нет, то как лучше всего выяснить, какие объекты должны быть перезагружен, что там еще и т.д?

Ответы [ 2 ]

1 голос
/ 25 августа 2011

Я думаю, можно с уверенностью предположить, что стандартные правила управления памятью применяются даже в многозадачной среде. Это означает, что ваш контроллер и все, на что у вас есть ссылка в контроллере, должны оставаться действительными до:

  1. Вы явно освобождаете свой контроллер / объекты
  2. Ваше приложение завершает работу

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

Что касается вопроса viewDidLoad, вы можете реализовать viewDidUnload или проверить метод isViewLoaded, чтобы убедиться, что ваше представление не было выгружено из-за нехватки памяти или по другим причинам. Подробнее об этом в документации UIViewController .

1 голос
/ 25 августа 2011

Один из способов решения этой проблемы - лениво загруженные свойства.В вашем .h файле:

@interface YourViewController : NSObject
@property (nonatomic, retain) NSArray *exampleObject;
@end

И в вашем .m файле:

@implementation YourViewController

@synthesize exampleObject = _exampleObject;

- (NSArray *)exampleObject {
    // reload only if necessary
    if (!_exampleObject) {
        _exampleObject = [[NSArray alloc] init];
        // do whatever other setup you need to
    }
    return _exampleObject;
}

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