引用尚不存在的对象

时间:2012-02-21 09:06:54

标签: ios reference null storekit

我在应用程序委托中有一段代码,其中包含对在使用应用程序期间可能创建或不可能创建的视图的引用。只有在引用的对象出现后才会调用此代码,因此不会发生崩溃。

但是,编译器检测到此引用并发出警告:

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指针指向null?

3 个答案:

答案 0 :(得分:1)

您没有收到错误,因为应用程序启动时purchasingView可能是nil

您收到错误是因为purchasingViewNSObject,而NSObject未实施-dismissPurchasingViewAndUpdateSetupView方法。如果您将purchasingView的类型更改为您实施purchasingView的任何类,则错误将消失。

答案 1 :(得分:1)

首次运行时,编译器检测到purchasingViewnil的任何内容。它没有这样做。编译器不关心变量在运行时的值。此外,无论如何都要发送消息nil是完全有效的,并且是Objective-C运行时的一个很好用的“功能”。

您的问题是,在应用程序委托中,您大概不是#import - purchasingView所属的任何课程的标题,并且您说purchasingView是{在NSObject中{1}}。将其更改为应用程序委托标头中标题的appDelegatepurchasingView的实际类。

答案 2 :(得分:0)

[purchaseView perfromSelector:@selector(dismissPurchasingViewAndUpdateSetupView)]