在NSDictionary中插入nil时不会抛出异常

时间:2014-05-22 13:37:19

标签: ios objective-c facebook nsdictionary null

所以我正在努力从用户的Facebook专辑中提取照片,出于某种原因,NSDictionary在插入nil时不会抛出异常。 我已在真实设备和iOS模拟器(均为iOS 7)上对其进行了测试。 也许调试器崩溃了,也许是它的Facebook SDK bug。 无论如何,我已经准备好听你的意见。

更新:我还忘了提一件事。在调试器中,在字典中插入nil对象后,调试器本身继续执行程序。我甚至没有按下按钮"继续执行程序"。

这里是代码段

- (void)downloadAlbumsWithCompletionBlock:(void (^)(NSArray *albums, NSError *error))completionBlock;
{
    [FBRequestConnection startWithGraphPath:@"/me/albums"
                                 parameters:nil
                                 HTTPMethod:@"GET"
                          completionHandler:^(FBRequestConnection *connection, id result, NSError *error)
    {
        if (error)
        {
            NSLog(@"%@", error.localizedDescription);
            completionBlock(nil, error);
        }
        else
        {
            NSMutableArray *data = [result objectForKey:@"data"];
            NSMutableArray *albums = [NSMutableArray new];
            for (NSMutableDictionary *dict in data)
            {
                NSString *albumID = dict[@"id"];
                NSString *coverPhotoID = dict[@"cover_photo"];
                // coverPhotoID gets nil and then successfully gets put in NSDictionary
                // You can just write "NSString *coverPhotoID = nil;".
                NSString *description = dict[@"description"];
                NSString *name = dict[@"name"];
                NSDictionary *album = @{@"album_id": albumID,
                                      @"album_cover_photo_id": coverPhotoID,
                                      @"album_description": description,
                                      @"album_name": name };
                // Here an exception should be thrown but for some reason
                // we just quit out of the method. Result would be the same if we put
                // empty "return;" statement.
                // If we explicitly put nil, like 
                //   @"album_cover_photo_id": nil
                // we get compiler error.
                [albums addObject:album];
            }
            completionBlock(albums, nil);
        }
    }];
}

2 个答案:

答案 0 :(得分:4)

您写道:

// Here an exception should be thrown but for some reason
// we just quit out of the method. Result would be the same if we put empty "return;" statement.

很可能异常是在某个地方捕获的。尝试在Objective-C异常抛出上放置一个断点(在Xcode中,转到Breakpoint选项卡,单击左下角的+并选择Add Exception Breakpoint。确保参数设置为Objective-C异常并中断Throw)。

答案 1 :(得分:2)

你声称

NSString *albumID = dict[@"id"];
NSString *coverPhotoID = nil;
NSString *description = dict[@"description"];
NSString *name = dict[@"name"];
NSDictionary *album = @{@"album_id": albumID,
                       @"album_cover_photo_id": coverPhotoID,
                       @"album_description": description,
                       @"album_name": name };

不会导致您的应用崩溃。

老实说,我不相信。要么你在拖钓,要么你误解了发生的事情。

作为for周期的第一行,请记录dict字典:

NSLog(@"dict var: %@", dict);

dict是否包含密钥album_cover_photo_id

如果你得到像

这样的东西
"album_cover_photo_id" : null

然后NSString *coverPhotoID = dict[@"cover_photo"]将NSNull实例分配给coverPhotoID。在这种情况下,应用程序不会崩溃,因为NSNull实例不是nil

NSString *coverPhotoID = nil;

不同
NSString *coverPhotoID = [NSNull null];

服务器在JSON中返回null而不是省略密钥(服务器人很奇怪)是很常见的。


您也可以在创建后album登录

NSLog(@"album var: %@", album);

如果您100%确定要将nil添加到词典中,请将其带到Apple开发人员论坛。我打赌他们很想知道这个错误。

我希望这会以某种方式帮助你。