0

所以我有这个 NSArray,里面有 NSDictionaries。

正如您在代码中看到的那样,实际上有两个非常相等的 for 循环(不要介意为什么)。

如果你看到日志,第二个循环中第一个对象中的关键 scheduleID 突然为零......

我不知道这怎么可能。对象(NSDictionary)本身不是零。我正在使用 ARC。

UILocalNotification *mergedNotification = [notificationsWithEqualFireDates objectAtIndex:0];

    if ([notificationsWithEqualFireDates count] > 1) {
        NSMutableArray *mergedUserInfo = [[NSMutableArray alloc] init];
        for (UILocalNotification *ln in notificationsWithEqualFireDates) {
            NSLog(@"Hmmm... %@", [ln.userInfo objectForKey:@"scheduleID"]);
            [mergedUserInfo addObject:ln.userInfo];
        }
        NSDictionary *mergedUserInfoDictionary = [[NSDictionary alloc] initWithObjectsAndKeys:mergedUserInfo,@"array", nil];
        mergedNotification.userInfo = mergedUserInfoDictionary;
    }

    for (UILocalNotification *tempNotification in notificationsWithEqualFireDates) {
        NSManagedObject *managedObject = [NSEntityDescription insertNewObjectForEntityForName:@"RegisteredNotifications" inManagedObjectContext:newMoc];
        [managedObject setValue:tempNotification.fireDate forKey:@"fireDate"];
        [managedObject setValue:[tempNotification.userInfo objectForKey:@"dateTimeOriginal"] forKey:@"dateTimeOriginal"];
        [managedObject setValue:[tempNotification.userInfo objectForKey:@"scheduleID"] forKey:@"scheduleID"];
        NSLog(@"Saving schedule: %@", [tempNotification.userInfo objectForKey:@"scheduleID"]);
    }

在此处输入图像描述

更新 我能够通过使用复制方法来解决这个问题:

UILocalNotification *mergedNotification = [[notificationsWithEqualFireDates objectAtIndex:0] copy];

有人可以解释为什么会发生这种情况以及为什么我需要这种复制方法。我认为将 NSArray 中的对象分配给变量将是创建一个内存位置,对其进行初始化,然后将值从数组中的位置复制到变量...

4

3 回答 3

0

正在发布通知WithEqualFireDates。尝试使用带有强引用的属性。

于 2012-04-20T00:32:57.203 回答
0

猜测:

打印tempNotification.userInfo

它可能与您推入的任何东西相同mergedUserInfoDictionary;即您正在userInfo完全覆盖该代码中的。

不能肯定地说,因为你没有说明mergedNotification从哪里来。


你能解释一下这是怎么发生的吗?

您正在将数组的插槽 0 中userInfoNSNotification实例替换为不再具有您正在查找的键的字典。

于 2012-04-19T22:17:24.693 回答
0

我唯一能想到的是,notificationsWithEqualFireDates 不知何故超出了范围,它是一个 NSDictionary,对吗?是财产吗?我遇到了一个 NSString 变为 nil 的情况,它在方法内部的另一个类中被设置为弱属性,也许类似的东西?建议您调查一下和/或发布更多关于notificationWithEqualFireDates 来源的代码。另一种尝试是设置断点并在遍历上面的每一行时观察堆栈以查看它何时变为 nil ...

于 2012-04-19T22:20:04.290 回答