所以我正在努力从用户的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);
}
}];
}
答案 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开发人员论坛。我打赌他们很想知道这个错误。
我希望这会以某种方式帮助你。