惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Microsoft Azure Blog
Microsoft Azure Blog
S
Securelist
V
Vulnerabilities – Threatpost
C
Cyber Attacks, Cyber Crime and Cyber Security
Schneier on Security
Schneier on Security
Cyberwarzone
Cyberwarzone
Simon Willison's Weblog
Simon Willison's Weblog
Hacker News - Newest:
Hacker News - Newest: "LLM"
P
Palo Alto Networks Blog
T
Troy Hunt's Blog
SecWiki News
SecWiki News
Security Archives - TechRepublic
Security Archives - TechRepublic
T
The Blog of Author Tim Ferriss
Project Zero
Project Zero
Microsoft Security Blog
Microsoft Security Blog
The Register - Security
The Register - Security
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
J
Java Code Geeks
F
Full Disclosure
阮一峰的网络日志
阮一峰的网络日志
www.infosecurity-magazine.com
www.infosecurity-magazine.com
Attack and Defense Labs
Attack and Defense Labs
Know Your Adversary
Know Your Adversary
WordPress大学
WordPress大学
PCI Perspectives
PCI Perspectives
N
News | PayPal Newsroom
The Last Watchdog
The Last Watchdog
酷 壳 – CoolShell
酷 壳 – CoolShell
P
Privacy & Cybersecurity Law Blog
P
Proofpoint News Feed
V
Visual Studio Blog
C
CERT Recently Published Vulnerability Notes
H
Help Net Security
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
云风的 BLOG
云风的 BLOG
月光博客
月光博客
T
The Exploit Database - CXSecurity.com
I
InfoQ
大猫的无限游戏
大猫的无限游戏
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
U
Unit 42
腾讯CDC
小众软件
小众软件
V2EX - 技术
V2EX - 技术
罗磊的独立博客
Cloudbric
Cloudbric
Recorded Future
Recorded Future
IT之家
IT之家
Google DeepMind News
Google DeepMind News
C
CXSECURITY Database RSS Feed - CXSecurity.com

土土哥的Blog

好久没有更新博客=。= 阿里巴巴国际无线技术部 - 招人啦~求iOS、Android、Java 转-阿里巴巴国际无线技术部 - 在这里遇见最好的自己 反编译分析并模拟实现methodSignatureForSelector方法 反编译分析Xcode8的Bug, release下连续两次调用有二级指针参数的空方法会Crash 有趣的Autolayout示例5-Masonry实现 在对象dealloc的后期执行Task-开源库TTGDeallocTaskHelper 用QuartzCode快速实现一个收藏动画 开源项目-拼图验证控件TTGPuzzleVerify的实现 Swift开源Mac App - BingWallPaper 有趣的Autolayout示例4-Masonry实现 翻译-为什么objc_msgSend必须用汇编实现 API返回结果设计经验与总结 结合访问Out Parameters出现EXC_BAD_ACCESS的例子,反编译汇编解读__autoreleasing 总结一些iOS项目中组织代码的方法 对组件化与模块化的思考与总结 开源项目-TTGTagCollectionView 有趣的Autolayout示例3-Masonry实现 Swift开源项目: TTGEmojiRate的实现 Swift写的库-TTGSnackbar 有趣的Autolayout示例2-Masonry实现 解决iOS项目的版本兼容问题-结合宏、Category和Runtime 用Runtime的手段填充任意NSObject对象的nil属性 有趣的Autolayout示例-Masonry实现 UITextView编辑时插入自定义表情-续-自定义表情图片的大小 RPC框架Thrift例子-PHP调用C++后端程序 GCD使用经验与技巧浅谈 为GCD队列绑定NSObject类型上下文数据-利用__bridge_retained(transfer)转移内存管理权 Enum-枚举的正确使用-Effective-Objective-C-读书笔记-Item-5 @autoreleasepool-内存的分配与释放 有关宏定义的经验与技巧-简化代码-增强Log Effective-Objective-C-读书笔记-Item-4-如何正确定义常量 UITextView编辑时插入自定义表情-简单的图文混编 关于评论不见了=。= Entity和Model的不同-关于代码的数据层 一次审核被拒的经历-关于iCloud到底应该备份什么数据 Block类型变量-缓存Http请求与回调 提升UITableView性能-复杂页面的优化 NSString的Copy与内存分配 利用NSProxy实现消息转发-模块化的网络接口层设计-原创 Effective-Objective-C-读书笔记-Item-2 Effective-Objective-C-读书笔记-Item-1 iOS项目的目录结构-原创 Android开源库-LinkTextView-原创 第一篇Blog
Effective-Objective-C-读书笔记-Item-3
土土哥 · 2015-02-14 · via 土土哥的Blog

前言

item 3讲的是Objective-C里面的“字面量语法”-“Literal Syntax”,个人觉得非常有用。

Item 3 - Prefer Literal Syntax over the Equivalent Methods

本节讲了Objective-C中的“字面量语法”,并且建议我们更多的使用这种语法,而不是使用传统的等价的函数方法。

引子

当我们使用Objective-C编程的时候,总会经常使用到几种Foundation框架中的基本类,如NSString、NSNumber、NSArray、NSDictionary,或者是它们的子类。例如,当我们想创建一个字符串的时候,会这么写:

1
NSString *str = 

不知道各位写这句的时候有没有觉得奇怪?为什么不用先“alloc”,再“initWithXXX”这么来创建呢。是的,这里创建字符串,就用到了Objective-C提供的“字面量语法”-“Literal Syntax”,而这种语法的“标志”就是“@”符号。
有了字面量语法,我们就不用每次创建一些基本类型的时候,写一大堆alloc、init了。

NSNumber

字符串可以用字面量语法创建,数字类NSNumber肯定也可以,如下:

1
2
3
4
5
6
7
8
NSNumber *intNum = @1;
NSNumber *floatNum = @1.1f;
NSNumber *doubleNum = @1.1;
NSNumber *boolNum = @YES;
NSNumber *charNum = @'a';


NSNumber *intNumber = [[NSNumber alloc] initWithInt:1];

看,是不是很方便~

NSArray

创建

数组算是最常用的一种数据结构了,如果没有字面量语法,创建数组可能是这样:

1
NSArray *numbers = [[NSArray alloc] initWithObjects:@1, @1.1, @2.0f, @YES, nil];

用字面量语法的话,就是这样:

1
NSArray *numbers = @[@1, @1.1, @2.0f, @YES]

存取值

创建了数组,肯定要从数组里面取值,用NSArray的方法就是这样:

1
2
3
4
5

NSNumber *aNumber = [numbers objectAtIndex:2];

NSMutableArray *mutableArray = [[NSMutableArray alloc] initWithArray:@[@1, @2, @3]];
[mutableArray replaceObjectAtIndex:1 withObject:@4];

跟C语言、Java这些语法很不一样啊,人家都是通过中括号“[]”直接用下标取值就可以。有了字面量同语法,Objective-C也可以这样:

1
2
3
4
5

NSNumber *aNumber = numbers[2];

NSMutableArray *mutableArray = [[NSMutableArray alloc] initWithArray:@[@1, @2, @3]];
mutableArray[1] = @4;

要注意的地方

传统的通过“initWithObjects”方法创建数组的时候,是根据最后的“nil”判断数组是否结束的,也就是说,用于初始化数组的元素中有“nil”值也不会导致异常(Exception),如下语句:

1
2
3
4
5
6
7
8
9
10
NSNumber *number1 = @1;
NSNumber *number2 = nil;
NSNumber *number3 = @3;


NSArray *numbers = [[NSArray alloc] initWithObjects:
number1, number2, number3, nil];


NSLog(@"numbers count: %d", numbers.count);

但是,如果用字面量语法创建,就是出问题:

1
2
3
4
5
6
7
8
NSNumber *number1 = @1;
NSNumber *number2 = nil;
NSNumber *number3 = @3;


NSArray *numbers = @[number1, number2, number3];

NSLog(@"numbers count: %d", numbers.count);

因为字面量语法只是单纯的将中括号中的元素全部加到数组中,但是,Objective-C中的数组是不可以存放nil值的,所以程序会运行时抛出异常。

NSDictionary

创建

如果不用字面量语法创建字典,传统的创建函数简直令人匪夷所思:

1
2
3


NSDictionary *dict = [[NSDictionary alloc] initWithObjectsAndKeys:@1, @"number1", @2, @"number2", nil];

是不是很奇怪,value在前面,key在后面

所以,还是用新的语法吧:

1
NSDictionary *dict = @{@"number1" : @1, @"number2" : @2};

这样才符合“常识”嘛,key在前,value在后面,跟JSON的定义一样。

存取值

取值的语法跟NSArray的语法很想,只不过是将下标数字变成了key:

1
2
3
4
5
6
7

NSNumber *number1 = [dict objectForKey:@"number1"];
[dict setValue:@5 forKey:@"number1"];


NSNumber *number2 = dict[@"number1"];
dict[@"number1"] = @6;

注意

需要注意的地方,跟创建数组一样,NSDictionary的value不能为nil值,否则会抛出异常。

总结

总的来说,使用字面量语法可以让代码更加清晰、简单,毕竟,更少的代码,有时候意味着更少的错误。