-
原文URL:Embracing Modern Objective-C
本文将针对Objective-C和Cocoa框架的几项重要更新,做一个简单的介绍。撰写本文时,这些更新指的是由iOS 6和相应的SDK(Xcode 4.6)引入的那些。重要的更新(个人意见)会写在前面。
创建NSNumber literal、NSArray literal和NSDictionary literal的新语法
这项改进非常好用,能帮助我们少敲很多代码,且代码也会更干净易读。要创建NSNumber literal、NSArray literal和NSDictionary literal,现在可以使用带@前缀的语法。以下列举若干简单的例子:
NSNumber *a = @1.0; NSNumber *b = @NO; int c = 12; NSNumber *d = @(c); NSArray *ary = @[@"hello", @1]; NSDictionary *dict = @{@"key1":@"value1", @"key2":@2};
此外,也可以用[]来访问collection对象中的对象:
NSString *str = ary[0]; NSString *value = dict[@"key1"];
在iOS 6中,要获取通讯录中的数据,必须先询问并取得用户的“许可”。否则,相关的应用逻辑会“安静地”失败--应用会得到一个空的“通讯录”,且不会有错误提示。
此外,如果没有在真实设备上进行仔细的测试,而只是通过虚拟机来完成开发工作,也容易产生问题。这是因为虚拟机不支持相应的“数据隔离”(Data Isolation)功能,在用虚拟机跑iOS 6时,即使应用没有询问并取得“许可”,也能正确地获取通讯录中的数据。但是,一旦在真实设备中运行,潜在的问题就会暴露出来。
在Apple提供的文档“iOS SDK Release Notes for iOS 6”中,有一节特别提到了这个问题。要妥善处理这处“许可”问题,必须编写相应的代码、处理所有可能发生的错误并兼容之前的iOS 5模式。稍后有机会的话,再分享这部分的代码。
http://developer.apple.com/library/ios/#releasenotes/General/RN-iOSSDK-6_0/
viewWillUnload和viewDidUnload不会再被调用
在iOS 6中,UIViewController之前提供的两个方法viewWillUnload和viewDidUnload已经“过期”(deprecated),不会再被调用。对于之前需要在这两个方法中完成的任务,可以将相关的代码移入didReceiveMemoryWarning方法。对这个问题,仍需要相当的篇幅才能尽述,所以有机会再开新篇讨论。这里先给出一段覆盖didReceiveMemoryWarning方法的示例:
- (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; if (![self isViewLoaded]) { return; } if (self.view.window) { return; } // clean reloadable stuff here // ... }
新的enum语法
先看一则旧的enum声明代码:
enum { MyErrorUnknownType = 0, MyErrorHTTPType, MyErrorTypingType }; typedef NSUInteger MyErrorType;
如果使用新的语法,则声明MyErrorType的代码如下:
typedef NS_ENUM(NSUInteger, MyErrorType) { MyErrorUnknownType = 0, MyErrorHTTPType, MyErrorTypingType };
新的语法能为编译器和Xcode提供更多的信息,从而加强类型检查、自动补全等功能。
用CFBridgingRelease替换__bridge_transfer.
使用ARC时,对于Core Foundation框架的数据类型,如果要将其所有权(ownership)转移至某个Objective-C对象时(两者都支持toll-free bridging),之前必须使用“修饰符”(modifier)__bridge_transfer。现在则推荐使用宏CFBridgingRelease。这个宏的作用目前看来似乎只是为了能让代码更干净,但也可能是为将来的变化作预留。以下是一则使用CFBridgingRelease的例子:
NSString* email = CFBridgingRelease(ABMultiValueCopyValueAtIndex(emailProperty, j));
<br>
对于只在“当前”文件中使用的私有方法,现在可以不必作特别的声明,编译器不会发出警告。
这项新的语言特性也是相当好用的。在此之前,声明私有方法需要借助class extension,示例如下:
// FooClass.m @interface FooClass () - (void)privateMethod; @end @implementation FooClass - (void)foo { [self privateMethod]; } - (void)privateMethod { } @end
或者将私有方法的定义写在调用代码之前,以省略相应的声明,示例如下:
// FooClass.m @implementation FooClass () - (void)privateMethod { } - (void)foo { [self privateMethod]; } @end
现在不用再顾及私有方法的声明,可以在当前文件的任意位置定义私有方法。编译器能够自动识别并找出这些方法,也因此不会发出警告:
// FooClass.m @implementation FooClass () - (void)foo { [self privateMethod]; } - (void)privateMethod { } @end
可以将实例变量的声明移入.m文件
这项新的语言特性能帮助我们隐藏Objective-C类的实现细节。在此之前,必须在.h中声明实例变量(ivar):
// FooClass.h @interface FooClass : NSObject { NSString *_ivar; } @end
现在则可以在类的实现代码段中声明实例变量,示例如下:
// FooClass.m @implemation FooClass { NSString *_ivar; } @end
注意: 对于“私有属性”(private property),则仍必须在class extension中声明,示例如下:
// FooClass.m @interface FooClass () @property NSNumber *privateValue; @end @implemation FooClass { NSString *_ivar; } @end
<br>
可以省略@synthesize
现在可以省略@synthesize,编译器会代劳。例如下面这段代码,没有@synthesize也能正常工作(编译器会自动定义一个名为_name的实例变量,并将其和name属性关联):
// FooClass.h @interface FooClass : NSObject { } @property NSString *name; @end // FooClass.m @implementation FooClass @end
但是,如果你不打算使用编译器所采用的默认变量名,就要用@synthesize来明确地指定变量名,示例如下:
// FooClass.h @interface FooClass : NSObject { } @property NSString *name; @end // FooClass.m @implementation FooClass { NSString *_fullname; } @synthesize name = _fullname; @end
iOS 6 SDK的另一项重要改动是针对“自动转屏”(autorotation)的。 -
在iOS 6中,UIViewController之前提供的shouldAutorotateToInterfaceOrientation:方法已经“过期”(deprecated),不会再被调用。相对应的,需要通过其他途径来告知系统如何处理自动转屏。这些途径可分为两个级别,分别是“应用级别”和“视图控制对象级别”。此外还有一项重要的变动:容器类型的视图控制对象(例如UITabViewController或UINavigationController)不会再向其子视图控制对象询问是否应该自动转屏。
- 应用级别:可以通过编辑Info.plist,或者覆盖app delegate的application:supportedInterfaceOrientationsForWindow:方法来“设置”。此外,也可以在Xcode中,通过Target的Summary面板,借助“Supported Interface Orientations”界面来设置Info.plist文件中的,和自动转屏有关的参数。
- 视图控制对象级别:要让某特定类型的视图控制对象支持自动转屏,需要1)覆盖shouldAutorotate方法并返回YES。2)覆盖supportedInterfaceOrientations方法,返回一个特定的掩码,该掩码代表相应的视图控制对象所支持的所有自动转屏方向。
有若干细节点需要额外注意:- 系统会向顶层的,全屏的视图控制对象询问其支持的转屏方向,具体的询问时刻为每当:1)设备转动时 或 2)某个视图控制对象以全屏模态方式显示时。
- 针对某个视图控制对象,系统会结合(intersect)应用级别的自动转屏设置以及该视图控制对象自身所支持的自动转屏方向,来决定是否支持某个特定方向的自动转屏。也就是说,如果应用中的视图控制对象需要支持默认方向以外的自动转屏方向,哪怕只有一个,也需要在应用层面设置相应的自动转屏参数。
- 可以覆盖UIViewController的preferredInterfaceOrientationForPresentation方法(可选的),告之系统在显示相应的控制对象时,应该使用哪个方向。当然,对应的视图控制对象必须“支持”指定的方向。
- 在supportedInterfaceOrientations方法中,需要返回的是掩码(NSUInteger)。在 preferredInterfaceOrientationForPresentation方法中,需要返回的是方向类型(UIInterfaceOrientation)。如果在返回相应的数值时不加注意,就很容易产生错误:看上去代码正确,但是自动转屏却无法正确按预期工作。
- 浏览: 91304 次
- 性别:
- 来自: 杭州
文章分类
- 全部博客 (68)
- Spring (3)
- Java (9)
- Linux (5)
- 设计模式 (2)
- Web (2)
- Mac (6)
- Ubuntu (4)
- Windows (1)
- DB (2)
- plsql (0)
- Cache (2)
- Android (1)
- Javascript (1)
- 数据结构及算法 (1)
- 性能调优 (1)
- 并发及多线程 (2)
- Hadoop (1)
- 数据挖掘 (1)
- 版本控制 (1)
- Log4j (1)
- Node.js (1)
- NoSQL (1)
- 框架 (2)
- maven (2)
- 搜索及大数据处理 (1)
- Object-C (10)
- IOS (5)
- Lua (0)
- Ruby (1)
- Python (0)
- TCP/IP网络编程 (1)
- Objective-C (1)
- 前端 (1)
最新评论
发表评论
-
ReactiveCocoa
2017-01-19 17:23 349可以把信号想象成水龙头,只不过里面不是水,而是玻璃球(va ... -
iOS 开发工具及插件
2016-03-15 16:25 0J2ObjC 是一个来自 Google 的开源命令行 ... -
给Sublime Text 2添加OC编译运行环境
2014-03-18 16:47 1919sublime text 2 编译运行 objecti ... -
IOS图片等比缩放合成Demo代码
2014-02-18 18:57 1018//图片等比缩放合成并处于中心位置显示 - (UIIma ... -
收藏的IOS学习文档
2014-01-23 16:48 941http://iphonedevwiki.net/inde ... -
快速学习iPhone开发
2013-12-04 16:10 1080最好的网站: http://www.cocoachina. ... -
GCD之Dispatch Queue
2013-11-29 15:39 731iOS中多线程编程工具主 ... -
25条提高iOS App性能的技巧和诀窍
2013-11-29 15:25 1360这篇文章来自iOS Tutori ... -
IOS中使用Block的好处
2013-11-28 20:53 3038经过今天的Block的学习 ... -
NSNotification、delegate和KVO的区别
2013-11-26 19:37 1438KVO vs NSNotification vs proto ... -
OC学习笔记
2013-11-06 17:01 7491、Delegate http://leopard168 ... -
java与oc之间的区别
2013-11-04 13:56 2104转载自:http://blog.sina.c ... -
Object-C总结摘录
2013-11-02 20:07 10421、 Object-C语言是由Brad J.Cox于20世纪 ...
相关推荐
Cocoa多线程开发Objective-C详解 多线程 Objective-C iOS cocoa Xcode
本书结合理论知识与示例程序,全面而系统地讲述Objective-C编程的相关内容,包括Objective-C在C的基础上引入的特性和Cocoa工具包的功能及其中的框架,以及继承、复合、源文件组织等众多重要的面向对象编程技术。...
Cocoa and Objective-C cookbook, 学习Objective-C和Cocoa框架的经典书籍。
《Objective-C基础教程》结合理论知识与示例程序,全面而系统地讲述Objective-C编程的相关内容,包括Objective-C在C的基础上引入的特性和Cocoa工具包的功能及其中的框架,以及继承、复合、源文件组织等众多重要的...
3. Objective-C中的布尔类型 4. Objective-C中的null 5. 与C混合编写 6. 对象的初始化 7. Objective-C的description方法 8. Objective-C的异常处理 9. id类型 10. 类的继承 11. 动态判定与选择器 12. 类别Category ...
Objective-C的语法与Cocoa框架 Objective-C基本语法的学习,iOS开发的基础
本书结合理论知识与示例程序,全面而系统地讲述Objective-C编程的相关内容,包括Objective-C在C的基础上引入的特性和Cocoa工具包的功能及其中的框架,以及继承、复合、源文件组织等众多重要的面向对象编程技术。...
全面系统地讲述了Objective-C的基础知识和面向对象编程的重要概念,结合实例介绍了Cocoa工具包的优秀特性及框架,以及继承、复合、对象初始化、类别、协议、内存管理和源文件组织等重要编程技术,教你如何针对iOS或...
《effective objective-c 2.0:编写高质量ios与os x代码的52个有效方法》是世界级c++开发大师scott meyers亲自担当顾问编辑的“effective software development series”系列丛书中的新作,amazon全五星评价。...
本书受到GoF的经典著作《设计模式》的启发,旨在引导大家掌握如何在iOS平台上以Objective-C语言实现 Cocoa Touch开发所要用到的传统设计模式。 解析iOS设计模式的开山之作 优化Objective-C编程实践的必修宝典 由此迈...
书中应用GoF的经典设计模式,介绍了如何在代码中应用创建型模式、结构型模式和行为模式,如何设计模式以巩固应用程序,并通过设计模式实例介绍MVC在CocoaTouch框架中的工作方式。 《Objective-C编程之道:iOS设计模式...
清晰的Objective-C基础教程和随书源码,本书全面而系统地讲述Objective-C语言的基础知识和面向对象编程的重要概念,结合实例介绍了Cocoa工具包的优秀特性和其中的框架,以及继承、复合、源文件组织、内存管理、对象...
iOS 图表框架 Cocoa-Charts ,Cocoa-Charts 是一个开源的 iOS 图表框架,基于 Apple Cocoa SDK 开发...
《Objective-C基础教程(第2版)》结合理论知识与示例程序,全面而系统地介绍了Objective-C编程的相关内容,包括Objective-C在C的基础上引入的特性、Cocoa工具包的功能及框架,以及继承、复合、源文件组织等众多重要的...
书中应用GoF的经典设计模式,介绍了如何在代码中应用创建型模式、结构型模式和行为模式,如何设计模式以巩固应用程序,并通过设计模式实例介绍MVC在CocoaTouch框架中的工作方式。 《Objective-C编程之道:iOS设计...
第二部分详细阐述了Foundation框架,涵盖数字、字符串、集合、文件操作、内存管理、对象复制和归档等重要内容;第三部分简要介绍了Cocoa和iPhone SDK;第四部分是附录,主要列出了Objective-C的快速参考。 ...
最新版的objective-c基础教程,包括Objective-C在C的基础上引入的特性、Cocoa工具包的功能及框架,以及继承、复合、源文件组织等众多重要的面向对象编程技术。适合各类开发人员阅读。
第1部分 Objective-C语言 第2章 Objective-C程序设计 2.1 编译并运行程序 2.1.1 使用Xcode 2.1.2 使用Terminal 2.2 解释第一个程序 2.3 显示变量的值 2.4 小结 2.5 练习 第3章 类、对象和方法 3.1 到底什么是对象 ...