0

我有这行代码:

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

在 iPhone 4.3 模拟器和运行 4.x 的 iPhone 上运行良好。然而,在运行 3.x 的 iPhone 上发生了崩溃。说得通。我的猜测是,当没有多任务处理时,那行代码不起作用。

我很难调试,因为使用 3.x 系统为我测试的人在远程位置。我什至不确定符号 UIApplicationDidEnterBackgroundNotification 是否评估为正确的字符串、零或随机未初始化内存,或者该操作系统上的什么。

但是除了弄清楚它为什么失败之外,我可以通过一些努力来做到这一点,我应该怎么做?如何在观察之前检测特定通知是否存在?或者我是否检查多任务处理是否可以作为一般类别使用?我想我认为这行代码是安全的。如果操作系统从不生成该通知,那么我不会收到通知,但线路不应该崩溃。

4

4 回答 4

3

您应该在编译时检查 iOS 版本是否为 4.0 或更高版本(为此有内置的预处理器#defines)并测试多任务支持(以防它在设备上被禁用而原本支持的情况):

#if __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_4_0
    if([[UIDevice currentDevice]
        respondsToSelector:@selector(isMultitaskingSupported)] &&
       [[UIDevice currentDevice] isMultitaskingSupported])
    {
        [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(stop) name:UIApplicationDidEnterBackgroundNotification object:nil];
    }
#endif

您不必使用#if,但它节省了编译额外检查,您知道这些检查将始终返回错误。

于 2011-09-13T05:07:21.780 回答
1

只是为了您的启发,在注册未知通知时发生的问题并不多,而是通知名称不存在(正如您所怀疑的那样),实际上甚至不是 that UIApplicationDidEnterBackgroundNotificationis NULL,而是实际上&UIApplicationDidEnterBackgroundNotificationNULL; 实际上,这就是您对其进行测试的方式

所以在你的情况下发生(发生)的是一个简单的 NULL 取消引用,NSNotificationCenter甚至没有参与。

于 2013-04-19T13:05:01.287 回答
0

我认为这对你有用,我没有检查。

#ifdef _USE_OS_4_OR_LATER
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(stop) name:UIApplicationDidEnterBackgroundNotification object:nil];
#endif
于 2011-09-13T04:56:41.963 回答
0

在 4.0 之前不存在后台处理(即多任务处理)。注册到一个不存在的通知应该不会造成太大的损害。我希望它永远不会被调用。但我承认我没有用通知测试过这个。

下面的示例在运行时检查操作系统版本(此处为 4.0 和 3.2),然后执行一种或另一种方法。

NSString *requiredSystemVersion = @"4.0"; 
NSString *currentSystemVersion = [[UIDevice currentDevice] systemVersion];
if (![currentSystemVersion compare:requiredSystemVersion options:NSNumericSearch] != NSOrderedAscending) [self do4dotXStuff];

requiredSysVer = @"3.2";
if ([currentSystemVersion compare:requiredSystemVersion options:NSNumericSearch] != NSOrderedAscending) [self do3dotTwoStuff];
于 2011-09-13T10:28:32.073 回答