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

推荐订阅源

Hacker News: Ask HN
Hacker News: Ask HN
D
DataBreaches.Net
Microsoft Security Blog
Microsoft Security Blog
U
Unit 42
V
Visual Studio Blog
GbyAI
GbyAI
云风的 BLOG
云风的 BLOG
博客园 - Franky
C
CXSECURITY Database RSS Feed - CXSecurity.com
大猫的无限游戏
大猫的无限游戏
P
Privacy & Cybersecurity Law Blog
T
The Exploit Database - CXSecurity.com
Simon Willison's Weblog
Simon Willison's Weblog
L
LangChain Blog
I
Intezer
V2EX - 技术
V2EX - 技术
Google DeepMind News
Google DeepMind News
T
Threat Research - Cisco Blogs
Apple Machine Learning Research
Apple Machine Learning Research
V
V2EX
腾讯CDC
博客园 - 【当耐特】
Know Your Adversary
Know Your Adversary
TaoSecurity Blog
TaoSecurity Blog
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
F
Fortinet All Blogs
Project Zero
Project Zero
Blog — PlanetScale
Blog — PlanetScale
S
Security @ Cisco Blogs
量子位
M
MIT News - Artificial intelligence
美团技术团队
C
Cisco Blogs
S
Schneier on Security
Recent Commits to openclaw:main
Recent Commits to openclaw:main
G
Google Developers Blog
N
News and Events Feed by Topic
MongoDB | Blog
MongoDB | Blog
The Hacker News
The Hacker News
H
Help Net Security
S
Secure Thoughts
Scott Helme
Scott Helme
SecWiki News
SecWiki News
T
Troy Hunt's Blog
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
博客园 - 叶小钗
O
OpenAI News
Application and Cybersecurity Blog
Application and Cybersecurity Blog
博客园 - 司徒正美
T
Tenable Blog

土土哥的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-3 Effective-Objective-C-读书笔记-Item-2 iOS项目的目录结构-原创 Android开源库-LinkTextView-原创 第一篇Blog
Effective-Objective-C-读书笔记-Item-1
土土哥 · 2015-02-05 · via 土土哥的Blog

前言

一直都在做项目,没什么时间作总结,感觉很不是滋味。现在放假了,嗯,终于有时间了~~哈哈(天生程序猿一枚好不好=。=)
最近开始读英文版的Effective Objective-C 2.0,觉得不错,就总结些东西,分享给各位读者吧。

Item 1 - Familiarize Yourself with Objective-C’s Roots

第一章的目的,就是让大家熟悉Objective-C,自然,标题的意思也就是“了解Objective-C的基本概念”,不多说,开写。

消息与运行时

总的来说,Objective-C跟C++、Java这些面向对象的语言是非常相似的,但是还是有许多不同的地方。如果你是第一次看到Objective-C的语法,一定觉得非常奇怪,因为Objective-C使用的是基于消息(Message)的框架,而不是传统的方法、函数调用。如下:

1
2
3
4
5
6
7
8
9
10
11

Person *person = [Person new];
[person setName:@"tutuge" age:24];


Person person = new Person();
person.setNameAndAge("tutuge", 24);


Person *person = new Person;
person->setNameAndAge("tutuge", 24);

很奇怪是不是,各种中括号。但是我觉得,Objective—C这么设计就是为了时刻提醒你,“我是基于消息机制的!”。消息,的确是Objective-C与Java、C++这种语言最大的不同,而且,这种不同远不止在语法上面。简单来说如下两点:

  • 基于消息的调用: 所有的函数调用都是在“运行时”决定的。
  • 基于方法的调用: 所有的函数调用都是在“编译时”决定的,就是编译器编译时决定的。

其实,连被调方法的对象类型,都是在运行时决定的。所以说,Objective-C的运行时系统,担负了绝大部分的工作。这么设计的优点,举个例子,就是当运行时系统升级时,原有的代码不用重新编译即可“享受”升级带来的好处。

C的超集

Objective-C是C语言的超集,所以C语言所具有的一切特性,Objective-C都可以兼容,充分理解C语言的内存模型,对理解Objective-C很有帮助。如下:

1
NSString *str = 

这一行代码跟C语言没有什么不同,(忽略@符号=。=),原理跟C语言也是一致的,就是str指针是NSString类型的指针,指向了一块存着字符串“a string”的内存区域。不同的是,在Objective-C里,所有的对象只可以声明为指针类型,所以如下代码是不合理的:

1
NSString str

为了更充分的理解,咱们看看如下例子:

1
2
NSString *str1 = 
NSString *str2 = str1;

熟悉C语言的朋友应该知道这是怎么回事,内存当中只有一块区域储存着“a string”这个字符串,str1、str2都是指向着这个区域的字符串指针。如下图:

image

  • str1、str2都在栈内存上分配的,就是字符串(NSString)类型的指针。
  • “a string”字符串实际储存在堆内存上。
  • str1、str2均指向同一块内存区域。

此处的栈内存、堆内存跟C语言中的概念也是一样的,不同的是,在Objective-C中,我们不用手动去malloc、free内存,Objective-C使用内存计数计数帮我们管理内存。

结构体,基本类型

在Objective-C中,并不是所有的变量都是指针类型的,像int、float、double这些依旧是传统的“栈上分配”的,当然,还有结构体struct、枚举enum、联合union等。如:

1
2
CGPoint point = CGPointMake(10, 10);
CGRect frame = CGRectMake(0, 0, 10, 10);

这的CGPoint、CGRect都是结构体,但是都是直接在栈上分配内存的,以减少过度使用Objective-C类型的类(减少运行时的压力),各位读者使用的时候要注意。

总结

零散的说了一些Objective-C的特点,远远不足以讲明白Objective-C,我这只是根据Effective Objective-C这本书给个引子,还是推荐Apple的官方教程、文档,要想掌握扎实,还是要一步一步来~