For some reason this sample code works:
NSArray *immutable = @[ @"a", @"b", @"c" ];
NSMutableArray *mutable = (__bridge id)CFPropertyListCreateDeepCopy(kCFAllocatorDefault, (__bridge CFArrayRef)immutable, kCFPropertyListMutableContainers);
and this code produces nil
as a result of the conversion:
NSArray *immutable = @[ @"a", [NSNull null], @"c" ];
NSMutableArray *mutable = (__bridge id)CFPropertyListCreateDeepCopy(kCFAllocatorDefault, (__bridge CFArrayRef)immutable, kCFPropertyListMutableContainers);
I tried to find any mention of NSNull
not being allowed when using this function. I have a suspicion that it has something to do with the way method examines whether property is mutable or not, but I can't really back that up with facts.
Any ideas?
up vote
2 down vote
accepted
|
As kind people from apple developer forum pointed out the issue is that Property List Structure is rather strict about data types it can work with. NSNull is not one of allowed ones.
From apple docs:
Property lists are constructed from the basic Core Foundation types CFString , CFNumber , CFBoolean , CFDate , and CFData .
|
转载:http://stackoverflow.com/questions/12159205/cfpropertylistcreatedeepcopy-fails-to-process-array-dictionary-containing-nsnu
转换代码记录备份。注意:如果数据中有null,转换会返回nil
// NSArray --->>> NSMutableArray
NSMutableArray *mutableArray = CFBridgingRelease(CFPropertyListCreateDeepCopy(NULL, (__bridge CFPropertyListRef)(arrayData), kCFPropertyListMutableContainersAndLeaves));
//
NSDictionary--->>> NSMutableDictionary
NSMutableDictionary *mutableDict = (NSMutableDictionary *)CFBridgingRelease(CFPropertyListCreateDeepCopy(kCFAllocatorDefault, (__bridge CFPropertyListRef)(dictData), kCFPropertyListMutableContainersAndLeaves));