如何防止NSMutableDictionary 或 NSMutableArray 为 nil ,导致数据无法写入~~


try:

NSMutableArray *sectionTitles = [[NSMutableArray alloc] init];

or any of the following:

sectionTitles = [[NSMutableArray alloc] initWithCapacity:sectionTitles.count];
sectionTitles = [NSMutableArray new];
sectionTitles = [NSMutableArray array];
sectionTitles = [NSMutableArray arrayWithCapacity:sectionTitles.count];

maybe some silly ones:

sectionTitles = [NSMutableArray arrayWithArray:@[]];
sectionTitles = [@[] mutableCopy];


NSMutableDictionary和CFDictionary虽然都是字典类型,但是它们的底层实现不同。NSMutableDictionary是基于哈希表实现的,而CFDictionary是基于红黑树或哈希表实现的。因此,它们之间的转换需要进行数据拷贝,比较麻烦。 如果要将NSMutableDictionary转换为CFDictionary,可以使用CFDictionaryCreateMutable函数创建一个可变的CFDictionary,然后依次将NSMutableDictionary中的键值对添加到CFDictionary中。 示例代码如下: ``` NSMutableDictionary *dict = [NSMutableDictionary dictionaryWithObjectsAndKeys:@"value1", @"key1", @"value2", @"key2", nil]; CFMutableDictionaryRef cfDict = CFDictionaryCreateMutable(NULL, 0, &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks); [dict enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop) { CFDictionarySetValue(cfDict, (__bridge const void *)(key), (__bridge const void *)(obj)); }]; // 使用cfDict CFRelease(cfDict); ``` 需要注意的是,CFDictionary中键和值的类型必须是CFTypeRef类型的,因此需要进行桥接转换。在ARC环境下,需要使用__bridge关键字进行桥接转换。在非ARC环境下,需要手动进行内存管理。 如果要将CFDictionary转换为NSMutableDictionary,可以使用CFDictionaryGetCount和CFDictionaryGetValue函数依次遍历CFDictionary中的键值对,然后将它们添加到NSMutableDictionary中。 示例代码如下: ``` CFDictionaryRef cfDict = CFDictionaryCreate(NULL, NULL, 0, &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks); NSMutableDictionary *dict = [NSMutableDictionary dictionary]; CFIndex count = CFDictionaryGetCount(cfDict); const void **keys = (const void **)malloc(sizeof(void *) * count); const void **values = (const void **)malloc(sizeof(void *) * count); CFDictionaryGetKeysAndValues(cfDict, keys, values); for (CFIndex i = 0; i < count; i++) { id key = (__bridge id)(keys[i]); id value = (__bridge id)(values[i]); [dict setObject:value forKey:key]; } free(keys); free(values); // 使用dict ``` 同样地,在ARC环境下需要使用__bridge关键字进行桥接转换。在非ARC环境下,需要手动进行内存管理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值