Когда я должен позвонить супер? - PullRequest
23 голосов
/ 11 октября 2010

Как лучше всего использовать [super ... any method name].Недавно я обнаружил, что в Deloloc [super dealloc] должен стоять в том же конце.Потому что любая переменная, которая раньше не использовалась, может быть заполнена мусором, если мы установим ее после [super dealloc] Это редкость, но это возможно.После этого у нас будет сбой в нашем приложении.

Итак, как лучше всего использовать метод super, например, что лучше всего использовать для -(void)viewWillAppear:(BOOL)animated.Где лучшее место для [super viewWillAppear:(BOOL)animated] в начале тела или в конце?

Ответы [ 3 ]

55 голосов
/ 11 октября 2010

Обычное эмпирическое правило заключается в том, что когда вы переопределяете метод, который выполняет какую-то инициализацию, вы сначала вызываете super, а затем делаете свое дело. И когда вы переопределяете какой-то метод разрыва, вы вызываете super last:

- (void) setupSomething {
    [super setupSomething];
    …
}

- (void) tearDownSomething {
    …
    [super tearDownSomething];
}

Первый тип - это методы типа init…, viewWillAppear, viewDidLoad или setUp. Вторые вещи, такие как dealloc, viewDidUnload, viewWillDisappear или tearDown. Это не жесткое правило, оно просто следует из того, что делают методы.

17 голосов
/ 03 января 2011

Просто проверьте соответствующую документацию.Например, когда вызывать super в переопределенных методах UIViewController :

didReceiveMemoryWarning : вы можете переопределить этот метод (при необходимости), чтобы освободить любую дополнительную памятьиспользуется вашим контроллером просмотра.Если вы это сделаете, обязательно вызовите реализацию super в какой-то момент, чтобы позволить контроллеру представления освободить свое представление. [Означает, что порядок не имеет значения.]

loadView : Ваша пользовательская реализация этого метода не должна вызывать super .

setEditing: animated : Этот метод должен вызывать реализацию super перед обновлением его представления. [Означает, что порядок важен.]

viewWillAppear , viewDidAppear , viewWillDisappear , viewDidDisappear : если вы переопределите этот метод, вы должны вызвать super в какой-то момент вашей реализации. [Означает, что заказ не имеет значения.]

dealloc: Если вы реализуете этот метод, но создаете свое приложение для iOS 2.x, ваш метод dealloc долженосвободить каждый объект, но также следует установить ссылку на этот объект на ноль перед вызовом super . [Означает, что порядок важен.]

Реализованы ли вы аналогичные правила для super в методах viewDidLoad и viewDidUnload?Потому что вам не нужно называть это супер.

3 голосов
/ 11 октября 2010

Это в основном зависит от того, нужно ли, чтобы ваш подкласс происходил до или после метода суперкласса. Или оба, в зависимости от обстоятельств.

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

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