《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";

目录
相关文章
|
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 也是建立在引用计数的基础之...
1260 0
|
安全 iOS开发 编译器
Effective Objective-C 2.0
本书是iOS开发进阶的必读书籍之一。文中部分名词的中文翻译略坑,比如对block和GCD的翻译。其他整体还好,原作者写的比较用心。代码规范讲了不少,底层原理讲了一点点,且主要集中在第二章。
1357 0
|
安全 iOS开发 编译器
Effective Objective-C 2.0 Tips 总结 Chapter 3 & Chapter 4
Chapter 3 接口与 API 设计 Tips 15 使用前缀避免明明空间冲突 Objective-C 没有命名空间,所以我们在起名时要设法避免命名冲突 避免命名冲突的方法就是使用前缀 应用中的所有名称都需要加前缀(包括实现文件中的全局变量和...
1069 0
|
iOS开发 编译器 C语言
Effective Objective-C 2.0 Tips 总结 Chapter 1 & Chapter 2
下面只是对读到的所有 Tips 结合我平时开发中遇到的问题进行总结,每一个 Tips 和书中的每一条对应,本文的目的是去掉书中的大部分讨论的内容,让人能够马上使用这些 Tips,建议阅读过原书后食用更佳。
1131 0
|
C++ iOS开发 编译器
《Effective Objective-C 2.0》3、枚举类型表示状态、选项
第五条:使用枚举类型表示状态和选项,可以使代码更加清晰,可读性更好。 枚举类型使用关键字enum定义,通常与typedef相结合,定义一组状态或选项: typedef enum CustomState { CustomStateNon...
947 0
|
C++ iOS开发 编译器
《Effective Objective-C 2.0》1、熟悉Objective-C
该系列是《Effective Objective-C 2.0——编写高质量iOS与OS X代码的52个有效方法》的读书笔记。 第一条:了解Objective-C语言的起源 同C++类似,Objective-C也是C语言进行面相对象化的扩展。
974 0
|
iOS开发
Effective Objective-C 2.0 Reading Notes
1. Literal Syntax   NSString *someString = @"Effective Objective-C 2.0";   NSNumber *someNumber = [NSNumber numberWithInt:1]; NSNumber *someNum...
709 0
|
7天前
|
安全 编译器 Swift
IOS开发基础知识: 对比 Swift 和 Objective-C 的优缺点。
IOS开发基础知识: 对比 Swift 和 Objective-C 的优缺点。
111 2
|
7天前
|
缓存 开发工具 iOS开发
优化iOS中Objective-C代码调起支付流程的速度
优化iOS中Objective-C代码调起支付流程的速度
17 2
|
7天前
|
安全 JavaScript 前端开发
IOS开发基础知识:介绍一下 Swift 和 Objective-C,它们之间有什么区别?
IOS开发基础知识:介绍一下 Swift 和 Objective-C,它们之间有什么区别?
82 0