Ссылка на объект, который еще не существует - PullRequest
0 голосов
/ 21 февраля 2012

У меня есть рабочий фрагмент кода в делегате приложения, который содержит ссылку на представление, которое может или не может быть создано во время использования приложения. Этот код будет в конечном итоге вызываться только после того, как указанный объект будет создан, поэтому вероятность сбоя отсутствует.

Однако компилятор обнаруживает эту ссылку и выдает предупреждение:

warning: Semantic Issue: Instance method
 '-dismissPurchasingViewAndUpdateSetupView' not found (return type
 defaults to 'id')

В двух словах, это то, что происходит:

В заявке делегат:

@interface appDelegate : NSObject
  {
   NSObject *purchasingView;
  }

  @property (nonatomic, retain) NSObject *purchasingView;
@end

@implementation appDelegate
  @synthesize purchasingView;

-(void)aMethod
{  
  [purchasingView dismissPurchasingViewAndUpdateSetupView];       
}

В контроллере вида:

-(void) someOtherMethod
{
    //Let the app delegate know about the reference to this view
    appDelegate *appDelegate = (appDelegate *)[[UIApplication sharedApplication] delegate];
    appDelegate.purchasingView = self;
}

-(void)dismissPurchasingViewAndUpdateSetupView
{
    [self dismissModalViewControllerAnimated:YES];
}

Делегат приложения реализует SKPaymentTransactionObserver и получает уведомления App Store, инициируемые покупками в контроллере представления. Когда покупка завершается, делегат приложения уведомляет контроллер представления о своем отклонении.

Это разумный способ сделать это? Есть ли способ заставить компилятор игнорировать тот факт, что при первом запуске приложения указатель purchasingView указывает на ноль?

Ответы [ 3 ]

1 голос
/ 21 февраля 2012

Компилятор не обнаруживает что-либо о том, что purchasingView является nil при первом запуске.Это не делает этого.Компилятор не заботится о том, каково значение ваших переменных во время выполнения.Кроме того, оно в любом случае совершенно справедливо для сообщения nil и является довольно хорошо используемой «функцией» среды выполнения Objective-C.

Ваша проблема в том, что в делегате приложения вы, вероятно, не #import -добавьте заголовок для любого класса, которым является ваш purchasingView, и вы говорите, что purchasingView - это NSObject в appDelegate.Измените его на фактический класс purchasingView и #import заголовка в заголовке делегата приложения.

1 голос
/ 21 февраля 2012

Вы не получаете сообщение об ошибке, поскольку purchasingView может быть nil при запуске приложения.

Вы получаете ошибку, потому что purchasingView - это NSObject, а NSObject не реализует метод -dismissPurchasingViewAndUpdateSetupView. Если вы измените тип purchasingView на класс, в котором вы реализовали purchasingView, ошибка исчезнет.

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

[shoppingView perfromSelector: @selector (dismissPurchasingViewAndUpdateSetupView)]

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