Chinaunix首页 | 论坛 | 博客
  • 博客访问: 274160
  • 博文数量: 81
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 878
  • 用 户 组: 普通用户
  • 注册时间: 2014-07-25 23:20
文章分类

全部博文(81)

文章存档

2017年(45)

2016年(20)

2015年(2)

2014年(14)

我的朋友

分类: 网络与安全

2014-11-27 23:07:03

NSString *path = [self.dataPath stringByAppendingPathComponent:@"dummy.plist"];
NSMutableDictionary *dict = [[NSMutableDictionary alloc] initWithContentsOfFile:path];
NSString *dummyKeyValue = [dict valueForKey:@"dummyKey"]; // NSLog(@"%@",[NSString stringWithString:dummyKeyValue]);  [dict release];

NSString *anotherString = [dummyKeyValue lowercaseString];
当使用到dummyKeyValue时 挂掉。

背景:

  NSDictionary在获得里面的值后, 对Dict进行释放。此时value也全部释放了。 当有引用在使用该value时,就会野指针。

 

解决办法:

NSString *dummyKeyValue = [[[dict valueForKey:@"dummyKey"] retain] autorelease];

 

进一步: 

写分类来代替valueForKey方法。该分类实现下面功能

1. 类型转换保护

2. 数据内存计数保护(如上面所说)

 

例子:

- (NSString *)stringAtPath:(NSString *)path
{
    NSObject * obj = [[[self objectAtPath:path]retain]autorelease]; if ( [obj isKindOfClass:[NSNull class]] )
    { return nil;
    } else if ( [obj isKindOfClass:[NSNumber class]] )
    { return [NSString stringWithFormat:@"%lld", [(NSNumber *)obj longLongValue]];
    } else if ( [obj isKindOfClass:[NSString class]] )
    { return (NSString *)obj;
    } return nil;
}
阅读(1654) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~