繁体   English   中英

NSNotificationCenter代码可在iPhone中使用,但不能在iPad上使用

[英]NSNotificationCenter Code works in iPhone but not on iPad

[[NSNotificationCenter defaultCenter] addObserver:self 
                                      selector:@selector(didEnterBackground:)
                                      name:UIApplicationDidEnterBackgroundNotification
                                      object:nil];

为什么此代码在iPhone模拟器上却不能在iPad模拟器上起作用? 我在此代码上得到EXC_BAD_ACCESS 尝试过iOS 3.2、4.2、4.3版本。

为了扩大对Chiefly Izzy的评论, UIApplicationDidEnterBackgroundNotification被定义为extern NSString * 通常最好这样定义常量字符串,而不是这样:

#define UIApplicationDidEnterBackgroundNotification @"whatever"

因为它允许您通过身份而不是相等性进行测试,所以用户尝试引用UIApplicationDidEnterBackgroundNotification的所有尝试都将引用它的相同实例,而不仅仅是(可能受编译器命令的约束)具有相同值的单独NSString。

UIApplicationDidEnterBackgroundNotification的实际值包含在UIKit中,因此,在加载UIKit库时,将填充指针。问题是iOS 3.2没有定义UIApplicationDidEnterBackgroundNotification,因此最终得到的是未定义的指针。 因此,您将未定义的指针传递给NSNotificationCenter,从而在尝试读取它时导致崩溃。

聪明的事情可能是:

UIDevice *currentDevice = [UIDevice currentDevice];

if( [currentDevice respondsToSelector:@selector(isMultitaskingSupported)] && 
    [currentDevice isMultitaskingSupported])
{
    [[NSNotificationCenter defaultCenter] addObserver:self 
                              selector:@selector(didEnterBackground:)
                              name:UIApplicationDidEnterBackgroundNotification
                              object:nil];
}

因此,您检查该设备上的UIDevice类的版本是否知道甚至可以执行多任务,如果可以,则是否支持多任务。 标准的C快捷方式评估意味着&&之后的事物只有在成功之前的事物中才会被评估,因此不会偶然发出无法识别的方法调用。

仅当支持多任务处理时,您才注册该通知。 这是安全的,因为在多任务处理的同时引入了UIApplicationDidEnterBackgroundNotification字符串。 没有支持多任务并且不提供字符串的设备。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM