-
原文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)。如果在返回相应的数值时不加注意,就很容易产生错误:看上去代码正确,但是自动转屏却无法正确按预期工作。
- 浏览: 93946 次
- 性别:
- 来自: 杭州
文章分类
- 全部博客 (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 396可以把信号想象成水龙头,只不过里面不是水,而是玻璃球(va ... -
iOS 开发工具及插件
2016-03-15 16:25 0J2ObjC 是一个来自 Google 的开源命令行 ... -
给Sublime Text 2添加OC编译运行环境
2014-03-18 16:47 1964sublime text 2 编译运行 objecti ... -
IOS图片等比缩放合成Demo代码
2014-02-18 18:57 1063//图片等比缩放合成并处于中心位置显示 - (UIIma ... -
收藏的IOS学习文档
2014-01-23 16:48 981http://iphonedevwiki.net/inde ... -
快速学习iPhone开发
2013-12-04 16:10 1115最好的网站: http://www.cocoachina. ... -
GCD之Dispatch Queue
2013-11-29 15:39 780iOS中多线程编程工具主 ... -
25条提高iOS App性能的技巧和诀窍
2013-11-29 15:25 1399这篇文章来自iOS Tutori ... -
IOS中使用Block的好处
2013-11-28 20:53 3079经过今天的Block的学习 ... -
NSNotification、delegate和KVO的区别
2013-11-26 19:37 1490KVO vs NSNotification vs proto ... -
OC学习笔记
2013-11-06 17:01 8081、Delegate http://leopard168 ... -
java与oc之间的区别
2013-11-04 13:56 2157转载自:http://blog.sina.c ... -
Object-C总结摘录
2013-11-02 20:07 10781、 Object-C语言是由Brad J.Cox于20世纪 ...
相关推荐
Objective-C语言和Cocoa框架之间的关系,可以用一句话来概括:Objective-C是实现Cocoa框架应用程序的工具,而Cocoa框架是Objective-C在苹果平台上开发应用程序的核心。 在今天的开发实践中,Objective-C已经逐渐被...
这本书以其丰富的图文并茂的讲解方式,使得复杂的编程概念变得易于理解,是学习Objective-C和Cocoa框架的理想起点。 Cocoa是Apple开发的应用程序框架,用于构建macOS和iOS应用程序。它包含了大量类库,这些类库提供...
《Mac编程入门:使用Objective-C和Cocoa开发》这本书旨在帮助初学者快速上手Mac应用开发,并通过实用的例子引导读者逐步掌握Objective-C和Cocoa框架的核心概念。 #### Objective-C简介 Objective-C是一种通用、...
Objective-C是苹果早期的编程语言,它是Cocoa框架的基础,具有消息传递机制和动态类型等特点。虽然Swift已经成为苹果官方推荐的语言,但Objective-C在许多现有项目中仍然广泛使用,因此了解其性能调优策略同样重要。...
《Objective-C高级编程:iOS与OS X多线程和内存管理》是一本深入探讨Apple平台开发中的关键技术的书籍。本书主要围绕Objective-C语言在iOS和OS X操作系统上的应用,特别是针对多线程和内存管理这两个核心主题进行...
Cocoa框架是Objective-C的重要组成部分,包括两个主要部分:Cocoa Touch(用于iOS)和Cocoa(用于macOS)。Cocoa框架提供了大量的类和工具,用于构建用户界面、处理事件、网络通信、数据持久化等。 1. **Foundation...
在Swift与Objective-C的世界里,混编技术使得开发者可以充分利用这两种语言的优点,为iOS和macOS应用程序开发带来更大的灵活性。"Using Swift with Cocoa and Objective-C(4.1)"是Apple官方发布的文档,旨在帮助...
- **Cocoa Touch框架**: 这是一组用于开发iOS应用的API集合,它完全支持Objective-C,并提供了丰富的UI组件和系统服务接口。 - **Xcode集成**: Xcode是苹果官方提供的集成开发环境(IDE),它集成了Objective-C的编辑...
Objective-C 作为一种强大的面向对象编程语言,为开发者提供了丰富的工具和框架来构建复杂的 macOS 和 iOS 应用程序。通过以上章节的学习,开发者不仅可以掌握 Objective-C 的基本语法,还能深入了解 Cocoa ...
书中的内容覆盖了iOS开发的关键知识点,包括Objective-C编程语言、苹果的Cocoa Touch框架以及如何高效地使用这些工具来构建高质量的iOS应用。 Objective-C是iOS开发的核心语言,它基于C语言并添加了Smalltalk式的...
《Objective-C基础教程》是一本面向初学者的编程书籍,主要涵盖了Objective-C语言的基本概念、语法和编程实践,尤其适合那些想要踏入iOS应用开发领域的学习者。Objective-C是Apple公司开发的面向对象的编程语言,它...
### 关于Objective-C与Cocoa框架的关键知识点 #### 一、Objective-C简介 Objective-C是一种通用、面向对象的编程语言,由苹果公司在其操作系统macOS和iOS中广泛使用。它是基于C语言的一种扩展,增加了面向对象的...
C编程的电子书,可能涵盖了语言的基本语法、类和对象的概念、消息传递机制、内存管理(在Objective-C中是ARC,即自动引用计数)、类别、协议、 Blocks、GCD(Grand Central Dispatch)以及Cocoa或Cocoa Touch框架的...
4. **Cocoa和Cocoa Touch**:对于OS X和iOS开发分别介绍Cocoa和Cocoa Touch框架,理解 MVC(Model-View-Controller)设计模式。 5. **Xcode工具链**:如何使用Xcode IDE进行项目创建、调试和测试,以及Interface ...