我在应用程序委托中有一段代码,其中包含对在使用应用程序期间可能创建或不可能创建的视图的引用。只有在引用的对象出现后才会调用此代码,因此不会发生崩溃。
但是,编译器检测到此引用并发出警告:
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?
答案 0 :(得分:1)
您没有收到错误,因为应用程序启动时purchasingView
可能是nil
。
您收到错误是因为purchasingView
是NSObject
,而NSObject
未实施-dismissPurchasingViewAndUpdateSetupView
方法。如果您将purchasingView
的类型更改为您实施purchasingView
的任何类,则错误将消失。
答案 1 :(得分:1)
首次运行时,编译器未检测到purchasingView
为nil
的任何内容。它没有这样做。编译器不关心变量在运行时的值。此外,无论如何都要发送消息nil
是完全有效的,并且是Objective-C运行时的一个很好用的“功能”。
您的问题是,在应用程序委托中,您大概不是#import
- purchasingView
所属的任何课程的标题,并且您说purchasingView
是{在NSObject
中{1}}。将其更改为应用程序委托标头中标题的appDelegate
和purchasingView
的实际类。
答案 2 :(得分:0)
[purchaseView perfromSelector:@selector(dismissPurchasingViewAndUpdateSetupView)]