《Effective Objective-C 2.0》2、数据的定义方法

简介: 第三条:多用字面量语法,少用等价的方法 这部分所描述的是创建foundation类的对象时的技巧。Foundation框架是iOS中至关重要的框架,iOS应用中大部分数据都可以用foundation类表示。

第三条:多用字面量语法,少用等价的方法

这部分所描述的是创建foundation类的对象时的技巧。Foundation框架是iOS中至关重要的框架,iOS应用中大部分数据都可以用foundation类表示。比较常用的有NSString、NSNumber、NSArray、NSDictionary等。除此之外对于字符串、矩阵、词典等集合类还有其"mutable"版本,如NSMutableString等,其特点是包含元素可以动态修改。

对于foundation类,新建一个对象可以同其他objective-c对象一样使用alloc+init方法。不过,使用字面量是一种更加有效的办法。

1、数值对象NSNumber:

NSNumber类可以封装整数、浮点数、字符、布尔值等类型。使用alloc+init方法新建一个NSNumber对象的方法:

NSNumber *num1 = [NSNumber numberWithInt:1];

使用字面语法的方法为:

NSNumber *num2 = @1;
明显可以看出,使用字面量语法的代码更加简洁。


2、数组对象NSArray:

创建一个数组的方法有:

NSArray *animals = [NSArray arrayWithObjects:@"cat", @"dog",@"mouse",@"badger"];
使用字面语法的方法:

NSArray *animals = @[@"cat", @"dog",@"mouse",@"badger"];
也可以使用字面量语法将自定义的对象包含在数组内:

NSArray *arr = @[obj1, obj2, obj3];

需要注意的是,在这种情况下,如果中括号内有元素为nil则程序会抛出异常。不过这也有一个好处就是可以更方便地排查错误所在。

3、字典对象

NSDictionary类可以按照键值对的格式进行映射关系数据的存储,创建NSDictionary对象的方法:

NSDictionary *dict = [NSDictionary dictionaryWithObjectsAndKeys:@"value1",@"key1",@"value2",@"key2",nil];
按照一般理解,通常的数据对应关系中“键”应该排在“值”的前面,因此上述写法并不是非常符合我们的习惯思维。使用字面量语法则好得多:

NSDictionary *dict = @[@"key1":@"value1",@"key2":@"value2",@"key3":@10];
同数组对象相似,字面量表示字典也会产生nil元素导致抛出异常的问题,使用时需注意。


需要注意的是,字面量语法生成的对象都是不可变的。如果需要它的可变版本则需要做一次可变复制,例如:

NSMutableArray *mutableArr =[ @[@1,@2,@3] mutableCopy];

第四条:固定数值多用类型常量,少用宏定义

定义常量时通常有两种方式,其一是定义为一个宏,其二是定义一个常量表示:

#define VIEW_WIDTH 240
#define VIEW_HEIGHT 50

static const int kViewWidth = 240;
static const int kViewHeight = 50;

如果采用宏定义的方法,那么这样的常量不包含数据类型,编译器会将出现宏的地方做一次简单替换。在代码的其他地方还可能进行重复宏定义,这种情况也很难排查。因此这并非一个好的办法。

使用常量则不存在这样的问题。此类常量通常由static和const修饰。static表示该常量仅仅在当前的源文件中有效,在其他源文件中不可见。如果没有static修饰符,则编译器将创建一个external symbol,如果另一个源文件中定义了同名符号将出现错误。const表示该变量实际为一个常量,任何视图修改其值的行为都将触发错误。

最后一点是常量不要定义在头文件中,而应定义在源文件中。如果某个常量需要对其他源文件公开,作为全局变量,应在头文件中声明,源文件中实现:

//var.h
extern NSString *const SomeConstant;

//var.m
NSString *const SomeConstant = @"SomeString";

目录
相关文章
|
22天前
|
数据采集 API 数据处理
Objective-C 音频爬虫:实时接收数据的 didReceiveData: 方法
Objective-C 音频爬虫:实时接收数据的 didReceiveData: 方法
|
4月前
|
数据采集 XML 存储
HTML内容爬取:使用Objective-C进行网页数据提取
HTML内容爬取:使用Objective-C进行网页数据提取
|
6月前
|
数据管理 API 开发工具
Objective-C网络请求开发的高效实现方法与技巧
Objective-C网络请求开发的高效实现方法与技巧
|
C# iOS开发 Java
****Objective-C 中的方法的调用
oc语言中采用特定的语言调用类或者实例(对象)的方法称为发送消息或者方法调用。 oc中方法的调用有两种:  第一种: [类名或对象名 方法名];   [ClassOrInstance method]; [ClassOrInstance method:arg1]; ...
1140 0
|
Java iOS开发
【iOS 开发】Objective - C 面向对象 - 方法 | 成员变量 | 隐藏封装 | KVC | KVO | 初始化 | 多态(二)
【iOS 开发】Objective - C 面向对象 - 方法 | 成员变量 | 隐藏封装 | KVC | KVO | 初始化 | 多态(二)
135 0
|
存储 安全 C语言
【iOS 开发】Objective - C 面向对象 - 方法 | 成员变量 | 隐藏封装 | KVC | KVO | 初始化 | 多态(一)
【iOS 开发】Objective - C 面向对象 - 方法 | 成员变量 | 隐藏封装 | KVC | KVO | 初始化 | 多态(一)
197 0
|
iOS开发 开发者 C++
Effective Objective-C 2.0 Tips 总结 Chapter 5,6,7
Effective Objective-C 2.0 Tips 总结 Chapter 5,6,7 Chapter 5 内存管理 Tips 29 理解引用计数 引用计数是 Objective-C 内存管理的基础,包括 ARC 也是建立在引用计数的基础之...
1290 0
|
安全 iOS开发 编译器
Effective Objective-C 2.0
本书是iOS开发进阶的必读书籍之一。文中部分名词的中文翻译略坑,比如对block和GCD的翻译。其他整体还好,原作者写的比较用心。代码规范讲了不少,底层原理讲了一点点,且主要集中在第二章。
1392 0
|
安全 iOS开发 编译器
Effective Objective-C 2.0 Tips 总结 Chapter 3 & Chapter 4
Chapter 3 接口与 API 设计 Tips 15 使用前缀避免明明空间冲突 Objective-C 没有命名空间,所以我们在起名时要设法避免命名冲突 避免命名冲突的方法就是使用前缀 应用中的所有名称都需要加前缀(包括实现文件中的全局变量和...
1101 0