深入iOS 5:解析两大隐藏特性

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

JSON序列化

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

  1. {"taken": "2011/07/13"
  2. "width": "3072",
  3. "height": "2304",
  4. "latitude": "39.52",
  5. "longitude": "-106.05",
  6. "url": "http://mypictures.com/12345.png"

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

  1. NSError *error = nil;
  2. NSData *data = [NSData dataWithContentsOfURL:webServiceURL];
  3. NSDictionary *photo = [NSJSONSerialization
  4. JSONObjectWithData:data
  5. options:NSJSONReadingMutableLeaves
  6. error:&error];
  7. NSNumber *width = [photo objectForKey:@"width"];
  8. NSNumber *height = [photo objectForKey:@"height"]; 

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

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

  1. NSError *error = nil;
  2. NSStream *stream = [self getMyStream];
  3. NSDictionary *photo = [NSJSONSerialization
  4. JSONObjectWithStream:stream
  5. options:NSJSONReadingMutableLeaves
  6. error:&error];
  7. NSNumber *width = [photo objectForKey:@"width"];
  8. NSNumber *height = [photo objectForKey:@"height"]; 

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

ARC(自动引用计数)

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

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

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

  1. NSDictionary *values =
  2.         [NSDictionary dictionaryWithObject:@"object" forKey:@"key"];
  3.  dictionary = (CFDictionaryRef)values;
  4. SomeFunctionCallThatNeesACFDictionary(dictionary); 

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

  1.   NSDictionary *values =
  2.         [NSDictionary dictionaryWithObject:@"object" forKey:@"key"];
  3. CFDictionaryRef dictionary = (__bridge CFDictionaryRef)values;
  4. SomeFunctionCallThatNeesACFDictionary(dictionary);
  5. NSDictionary *values =
  6.         [NSDictionary dictionaryWithObject:@"object" forKey:@"key"];
  7. CFDictionaryRef dictionary = (__bridge CFDictionaryRef)values;
  8. SomeFunctionCallThatNeesACFDictionary(dictionary); 
责任编辑:佚名 来源: pragprog
相关推荐

2011-07-01 10:42:51

IIS解析漏洞

2011-06-08 08:43:30

2010-07-15 14:25:06

Perl时间函数

2010-09-14 17:27:12

DIV CSS定位

2017-11-27 13:18:08

Cydia源iOSiPad

2010-07-15 09:49:23

Perl标量

2024-05-11 07:57:47

因果推断知识地图算法

2021-12-16 11:34:13

云计算软件技术

2012-02-01 09:59:05

TitaniumPhoneGapiOS

2009-11-30 16:55:10

微软合作Novell

2012-05-24 09:29:28

虚拟化ESG服务器虚拟化

2011-08-10 08:55:28

项目失败

2011-06-21 10:48:43

网络布线布线电磁

2010-05-04 14:30:45

Oracle数据

2021-07-27 22:34:09

iOS苹果系统

2010-09-17 16:18:43

Java内存溢出

2021-09-10 10:23:29

数字化

2012-02-07 12:59:26

IDC行业

2011-05-24 11:03:25

虚拟化

2022-02-24 08:00:00

API混合云数据
点赞
收藏

51CTO技术栈公众号