Ios 例外情况是';在NSDictionary中插入nil时抛出t

Ios 例外情况是';在NSDictionary中插入nil时抛出t,ios,objective-c,facebook,nsdictionary,null,Ios,Objective C,Facebook,Nsdictionary,Null,所以我正在从用户的Facebook相册中提取照片,出于某种原因,当插入nil时,NSDictionary不会抛出异常。 我已经在真实设备和iOS模拟器(都是iOS 7)上进行了测试。 可能调试器崩溃,可能是Facebook SDK错误。 不管怎样,我准备听听你的意见 更新:还有一件事我忘了提。在调试器中,在字典中插入nil对象后,调试器本身继续执行程序。我甚至没有按下“继续程序执行”按钮 下面是片段 - (void)downloadAlbumsWithCompletionBlock:(void

所以我正在从用户的Facebook相册中提取照片,出于某种原因,当插入nil时,NSDictionary不会抛出异常。 我已经在真实设备和iOS模拟器(都是iOS 7)上进行了测试。 可能调试器崩溃,可能是Facebook SDK错误。 不管怎样,我准备听听你的意见

更新:还有一件事我忘了提。在调试器中,在字典中插入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);
        }
    }];
}
你声称

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 };
不会使你的应用程序崩溃

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

作为
循环日志的
第一行,记录
dict
字典:

NSLog(@"dict var: %@", dict);
dict
是否包含键
album\u cover\u photo\u id

如果你得到像

"album_cover_photo_id" : null
然后,
NSString*coverPhotoID=dict[@“cover_photo”]
正在为
coverPhotoID
分配一个NSNull实例。在这种情况下,应用程序不会崩溃,因为NSNull实例不是
nil

NSString *coverPhotoID = nil;
那就不同了

NSString *coverPhotoID = [NSNull null];
服务器在JSON中返回
null
s而不是省略键是很常见的(服务器人员很奇怪)


您还可以在创建相册后记录相册

NSLog(@"album var: %@", album);
如果你100%确定你在给字典添加一个
nil
,那就把它带到苹果开发者论坛。我打赌他们一定很想知道那只虫子

我希望这对你有所帮助。

你声称

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 };
不会使你的应用程序崩溃

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

作为
循环日志的
第一行,记录
dict
字典:

NSLog(@"dict var: %@", dict);
dict
是否包含键
album\u cover\u photo\u id

如果你得到像

"album_cover_photo_id" : null
然后,
NSString*coverPhotoID=dict[@“cover_photo”]
正在为
coverPhotoID
分配一个NSNull实例。在这种情况下,应用程序不会崩溃,因为NSNull实例不是
nil

NSString *coverPhotoID = nil;
那就不同了

NSString *coverPhotoID = [NSNull null];
服务器在JSON中返回
null
s而不是省略键是很常见的(服务器人员很奇怪)


您还可以在创建相册后记录相册

NSLog(@"album var: %@", album);
如果你100%确定你在给字典添加一个
nil
,那就把它带到苹果开发者论坛。我打赌他们一定很想知道那只虫子

我希望这对你有所帮助。

你写道:

// 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中,转到断点选项卡,单击左下角的+并选择添加异常断点。确保参数设置为Objective-C异常和抛出时中断)。

您写道:

// 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中,转到断点选项卡,单击左下角的+并选择添加异常断点。确保参数设置为Objective-C异常并在抛出时中断)。

应用程序仍然崩溃吗?您替换了
NSString*coverPhotoID=dict[@“cover_photo”]带有
NSString*coverPhotoID=nil并且没有崩溃?对KIDdAe:不,应用程序没有崩溃。对rtiago42:是的,应用程序没有崩溃。@eoLithic这很奇怪。。。我刚刚写了一个应用程序,代码是
NSString*coverPhotoID=nil;NSDictionary*相册=@{“相册封面照片id”:封面照片id}和它崩溃。将相册字典打印到日志中。应用程序是否仍然崩溃?您已替换了
NSString*coverPhotoID=dict[@“cover_photo”]带有
NSString*coverPhotoID=nil并且没有崩溃?对KIDdAe:不,应用程序没有崩溃。对rtiago42:是的,应用程序没有崩溃。@eoLithic这很奇怪。。。我刚刚写了一个应用程序,代码是
NSString*coverPhotoID=nil;NSDictionary*相册=@{“相册封面照片id”:封面照片id}和它崩溃。把相册字典打印到日志上。我照你说的做了。我发现了一个异常,在调试器中我编写了“po$eax”,并得到了这样的结果:“***-[\uu NSPlaceholderDictionary initWithObjects:forKeys:count:]:尝试从对象[1]插入nil对象”。所以,是的,结果是抛出了异常,但我如何知道谁处理异常?我在谷歌上搜索了那个问题,但什么也没找到。我会尝试继续跳过。好吧,什么都没发生,程序只是在等待事件。我对上面的帖子做了一些更新。我从来都不需要它,所以我不确定它是如何工作的,但在编辑断点选项(左键单击列表中的断点)中,可以将其设置为捕获时中断,而不是抛出时断开,这将帮助您确定捕获异常的内容。或者,您可以查看函数调用堆栈(左侧第6个选项卡),除非您没有其中一个函数的代码,否则您应该能够看到捕获异常的内容。也许你的应用程序也有可能设置了全局异常处理程序?(参见
NSSetUncaughtExceptionHandler
)现在我有了完整的答案:这是Facebook SDK的错。看起来它可以处理块内可能发生的任何异常。那么,我能说什么呢:永远不要相信第三方组件!我照你说的做了。我发现了一个异常,在调试器中我编写了“po$eax”,并得到了这样的结果:“***-[\uu NSPlaceholderDictionary initWithObjects:forKeys:count:]:尝试从对象[1]插入nil对象”。所以,是的,结果是抛出了异常,但我如何知道谁处理异常?我在谷歌上搜索了那个问题,但什么也没找到。我会尝试继续跳过。好吧,什么都没发生,程序只是在等待事件。我对上面的帖子做了一些更新。我从来都不需要它,所以我不确定它是如何工作的,但是在编辑断点选项中(左键单击br