iOS 5两大隐藏特性

摘要:iOS 5的明星特性们相信各位已经耳熟能详了,像无线升级、iMessage、Siri等等。但接下来,本文作者Bill Dudney介绍的两个特性绝对值得开发者深入了解,有助于开发出更NB的Apps,带来打出隐藏Boss的快感。 JSON序列化 iOS 5加入了NSJSONSerialization类,可以将JSON和Foundation objects相互转换。来看一段图片的代码示例:...

iOS 5的明星特性们相信各位已经耳熟能详了,像无线升级、iMessage、Siri等等。但接下来,本文作者Bill Dudney介绍的两个特性绝对值得开发者深入了解,有助于开发出更NB的Apps,带来打出隐藏Boss的快感。

JSON序列化

iOS 5加入了NSJSONSerialization类,可以将JSON和Foundation objects相互转换。来看一段图片的代码示例:

{

"taken": "2011/07/13",

"width": "3072",

"height": "2304",

"latitude": "39.52",

"longitude": "-106.05",

"url": "http://mypictures.com/12345.png"

}

解析起来很简单,代码示例:

NSError *error = nil;

NSData *data = [NSData dataWithContentsOfURL:webServiceURL];

NSDictionary *photo = [NSJSONSerialization

JSONObjectWithData:data

options:NSJSONReadingMutableLeaves

error:&error];

NSNumber *width = [photo objectForKey:@"width"];

NSNumber *height = [photo objectForKey:@"height"];

齐活儿。不要另外去下载类库啊啥的,示例中的JSONOBjectWithData:options:error:方法具体是将数据参数转向NSDictionary。

NSJSONSerialization可以很容易的将数据解析到内存或者Stream里,对于大数据来说,用Stream的优势更明显,可以将数据分块来一点点的处理掉,从而使得内存资源得到尽量稀少的占用。再看一段示例,同上一段不同的是这次使用了JSONOBjectWithStream: variant方法:

NSError *error = nil;

NSStream *stream = [self getMyStream];

NSDictionary *photo = [NSJSONSerialization

JSONObjectWithStream:stream

options:NSJSONReadingMutableLeaves

error:&error];

NSNumber *width = [photo objectForKey:@"width"];

NSNumber *height = [photo objectForKey:@"height"];

iOS对JSON的支持甚至更进了一步,可以产生JSON数据。

ARC(自动引用计数)

很多用惯了有垃圾回收机制开发语言的开发者,用Objective-C会很不习惯,总是要进行很多内存管理的工作。苹果觉得垃圾回收这种严重影响电源使用效率的特性,同移动设备天生的实时性是相冲突的。但是在iOS 5当中苹果引入了自动内存管理机制,称作ARC。

为了解决保留/释放内存管理,ARC加入了一个新的概念称作“归零弱引用”,弱引用一旦不再没引用机会被清零。至此所有弱引用不再会指向悬摆指针,而是被自动清理掉。

如果你用ARC,那么必须向编译器声明你用Core Foundation对象干吗,否则会报错。先看一个可以导致报错的例子:

NSDictionary *values =

        [NSDictionary dictionaryWithObject:@"object" forKey:@"key"];

 dictionary = (CFDictionaryRef)values;

SomeFunctionCallThatNeesACFDictionary(dictionary);

如果只是想用dictionary作为CFDictionaryRef类,只需加一个 __bridge 就可以来。再来看正确的示例:

NSDictionary *values =

        [NSDictionary dictionaryWithObject:@"object" forKey:@"key"];

CFDictionaryRef dictionary = (__bridge CFDictionaryRef)values;

SomeFunctionCallThatNeesACFDictionary(dictionary);

NSDictionary *values =

        [NSDictionary dictionaryWithObject:@"object" forKey:@"key"];

CFDictionaryRef dictionary = (__bridge CFDictionaryRef)values;

SomeFunctionCallThatNeesACFDictionary(dictionary);

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值