iPhone - свойства, ивары и т. д. - PullRequest
0 голосов
/ 25 февраля 2012

На этом уроке , у автора есть следующие объявления:

на .ч

UIViewController *presentingViewController;
...

@property (retain) UIViewController *presentingViewController;

на .m

@synthesize presentingViewController;

в какой-то момент кода, внутри блока , он делает:

self.presentingViewController = viewController;

, а затем

[presentingViewController dismissModalViewControllerAnimated:NO];

Я нахожу это очень странным. Если is назначает viewController для self.presentingViewController, то должен ли он вызывать

    [self.presentingViewController dismissModalViewControllerAnimated:NO];

Я изменил его код на

.h

@property (retain) UIViewController *presentingViewController;

.m

@synthesize presentingViewController = _presentingViewController;

и что я делаю, это:

self.presentingViewController = viewController;

, а затем

    [self.presentingViewController dismissModalViewControllerAnimated:NO];

проблема в том, что self.presentingViewController равен нулю в этой строке, даже если он объявлен как retain и никогда не выпускается.

какие-нибудь подсказки?

спасибо

Ответы [ 2 ]

0 голосов
/ 25 февраля 2012

Вы удалили переменную экземпляра UIViewController *presentingViewController, когда добавили переменную экземпляра UIViewController *_presentingViewController? Если бы не я, я бы случайно положил на тебя деньги, когда в какой-то момент использовал неправильный.

Пошагово ... изначально у вас была переменная экземпляра

UIViewController *presentingViewController;

А из свойства синтаксического сахара у вас есть два метода доступа для установки и получения переменной

- (UIViewController *)presentingViewController;
- (void)setPresentingViewController:(UIViewController *)val;

в какой-то момент кода, внутри блока, он делает:

[self setPresentingViewController: viewController]; // uses setter

, а затем

[presentingViewController dismissModalViewControllerAnimated:NO]; // uses instance variable

это хорошо, но вы думаете, что это должно быть

UIViewController *localPresentingViewController = [self presentingViewController]; // uses getter
[localPresentingViewController dismissModalViewControllerAnimated:NO];

что тоже хорошо, но несколько ненужно.

Затем вы добавили новую переменную экземпляра: -

@synthesize presentingViewController = _presentingViewController;

так что теперь у вас есть

UIViewController *presentingViewController;
UIViewController *_presentingViewController;

// These now get / set _presentingViewController
- (UIViewController *)presentingViewController;
- (void)setPresentingViewController:(UIViewController *)val;

Но почти наверняка где-то вы путаете два ивара (или вы не знаете, что у вас есть два ивара), представляющих ViewController / _presentingViewController, и по-прежнему имеете ссылку на представительный ivarViewController, что заставляет вас думать, что ваше свойство равно нулю. *

0 голосов
/ 25 февраля 2012

Вы правы, что это должно быть:

[self.presentingViewController dismissModalViewControllerAnimated:NO];

Однако восстановите это:

@synthesize presentingViewController;

И удалите украшение экземпляра похожей переменной:

UIViewController *presentingViewController;
...