Objective-C是一门面向对象的编程语言, 是用于iOS开发的主流语言。本书作为iOS开发的入门教材, 站在初学者的校对, 以形象的比喻、丰富的案例、通俗易懂的语言, 全面要讲解了Objective-C的相关知识, 包括Objective-C开发工具的安装使用, 基本语法、面向对象思想、特有语法、内存管理, ARC机制、分类、延展、Block代码块、协议、Foundation框架。
本书是经典的Objective-C教材,在《Objective-C入门教程》的基础上进行了全面升级,不仅细化补充了很多新知识,而且针对每章都设计了阶段案例和配套练习,帮助读者巩固知识,提升学习效果。
特色一:化繁为简,降低初学者入门难度
在讲解知识点时,采用需求引入的方式,图文并茂地将一些复杂的知识点简化,从而降低初学者的入门难度。
特色二:目标清晰,帮助学习者掌握核心知识
在设定学习目标时,反复斟酌每个知识点的重要程度,非常清晰地描述知识点要求的掌握程度。
特色三:内容全面,开阔程序视野范围
全面涵盖iOS开发过程中Objective-C的编程思想和基本语法,开阔读者视野,让读者在学习后续iOS开发过程中熟练使用Objective-C语法。
特色四:免费提供丰富的配套资源
附有配套视频、源代码、习题、教学课件等资源,而且为了帮助初学者更好地学习本教材中的内容,还提供了在线答疑。
特色二:配套资源丰富
本书附有配套视频、源代码、习题、教学课件等资源。同时,为了帮助初学者及时地解决学习过程中遇到的问题,黑马程序员还专门提供了免费的在线答疑平台。
传智播客和“黑马程序员”
江苏传智播客教育科技股份有限公司(简称传智播客)是一家专门致力于培养高素质软件开发人才的科技公司,“黑马程序员”是传智播客旗下的高端IT教育品牌。
“黑马程序员”的学员多为大学毕业后想从事IT行业,但各方面条件还不成熟的年轻人。“黑马程序员”的学员筛选制度非常严格,除包括严格的技术测试、自学能力测试外,还包括性格测试、压力测试、品德测试等。百里挑一的残酷筛选制度确保了学员质量,降低了企业的用人风险。
自“黑马程序员”成立以来,教学研发团队一直致力于打造精品课程资源,不断在产、学、研三个层面创新自己的执教理念与教学方针,并集中“黑马程序员”的优势力量,有针对性地出版了计算机系列教材五十多种,制作了教学视频数十套,发表各类技术文章数百篇。
“黑马程序员”不仅斥资研发IT系列教材,还为高校师生提供以下配套学习资源与服务。
为大学生提供的配套服务:
1. 专注的辅助学习平台“博学谷”(http://yx.boxuegu.com),专业老师在线为学生答疑解惑。
2. 针对高校学生在学习过程中存在的压力等问题,我们还面向大学生量身打造了“播妞”。“播妞”不仅致力推行快乐学习,还会有定期的助学红包雨。读者可添加“播妞”微信/QQ: 208695827。
3. 高校学生也可扫描右方二维码,加入“播妞”粉丝团,获取最新学习资源,与“播妞”一起快乐学习。
为IT教师提供的配套服务:
针对高校教学,“黑马程序员”为IT系列教材精心设计了“教案+授课资源+考试系统+题库+教学辅助案例”的系列教学资源,高校老师请关注码大牛老师微信/QQ: 2011168841,获取教材配套资源,也可以扫描右方二维码,加入专为IT教师打造的师资服务平台——“教学好助手”,获取“黑马程序员”最新教师教学辅助资源相关动态。
传智人
2017年1月
ObjectiveC,通常写作ObjC或OC,较少写作Objective C或ObjC,它在 C 语言的基础上进行扩充,是支持面向对象的一门语言。ObjectiveC的流行归功于iPhone的成功,它可以编写的应用程序如下:
iOS操作系统
iOS应用程序
Mac OS X操作系统
Mac OS X 上的应用程序
为什么写本书
2014年,我们出版了一本《ObjectiveC入门教程》,该书站在初学者的角度,以形象的比喻、实用的案例、通俗易懂的语言,详细讲解了ObjectiveC 语言,受到广大读者的一致好评。
本书作为《ObjectiveC入门教程》的升级版,秉承之前教材的优点,不仅对开发环境和开发工具有所更新,而且在知识内容上也有所更新:
新增block代码块。作为ObjectiveC最新最强大的工具,本书通过对block代码块的定义和使用进行了详细讲解。block是苹果公司推荐的类型,效率高,可以帮助我们组织独立的代码段,并提高复用性和可读性。
内存管理。通过MRC到ARC的转变过程,深刻帮助读者理解ObjectiveC的内存管理机制,轻松搞定任何与内存管理相关的问题。
如何使用本书
本书以全新的OS X 10.11为平台,以Xcode 8.1为开发工具,全面介绍了ObjectiveC的基本知识。考虑到本书使用对象的不同,给予以下建议:
课堂教学,建议采用案例驱动的方式来讲授,让学生在动手完成“案例”的过程中,培养学生分析问题、解决问题的能力,使学生可以直观、深刻地学会ObjectiveC开发技能。
建议自主学习者勤思考、勤练习、勤检测。任何有疑惑的地方都可以向“问答精灵”咨询,每个知识点对应的案例都要独立完成,最后通过每章配套的习题进行自我检测。
本教材共有10章,具体内容如下。
第1章首先介绍了ObjectiveC语言的特点、发展历史以及未来的趋势,然后讲解了开发环境的搭建,包括系统环境和开发工具,并带领大家开发一个ObjectiveC程序,对程序的代码及编译进行讲解,最后讲解帮助文档的使用。
第2章讲解了ObjectiveC面向对象的概念,包括类和对象、类的设计与定义、对象的创建和访问、方法的使用等内容,帮助大家学会使用面向对象的编程思想编写简单的程序。除此之外,本章还介绍self、匿名对象和异常,并通过一个阶段案例,综合考查读者对项目需求的分析能力以及对面向对象基本知识的掌握程度。
前言ObjectiveC程序设计案例教程 第3章主要介绍面向对象的三大特征——封装、继承和多态,介绍访问修饰符的特点、里氏替换原则以及description方法的原理。通过本章的学习,希望读者能够理解并且掌握封装、继承和多态这三个特征,并且可以灵活运用,为后面的学习奠定扎实的基础。
第4章主要介绍ObjectiveC的特有语法,包括点语法、@property、@synthesize和@property的增强使用,还介绍静态类型、动态类型和构造方法的内容。希望读者认真学习本章内容,仔细体会ObjectiveC特有语法的特点和用法。
第5章主要介绍内存管理(MRC机制)的知识,包括引用计数器的概念、单个对象和多个对象的内存管理,以及@property参数的使用。大家应该掌握MRC内存管理的原理,便于更好地理解ARC机制的知识。
第6章主要介绍内存管理(ARC机制)的知识,包括概念、单个对象的内存管理、@property参数、循环引用,以及ARC和MRC的相互兼容问题。大家应该掌握ARC内存管理的原理,及时管理好程序的内存。
第7章主要讲解分类的相关知识,包括分类的简单实用、非正式协议和延展。希望读者在以后的学习中能够区分分类的不同使用情景,并灵活加以运用。
第8章主要介绍block代码块,包括block语法、block的简化、block内部访问外部变量、block作为函数的参数和返回值。block代码块这个知识点不难,并且是iOS开发经常用到的知识点,希望读者好好学习并掌握。
第9章主要讲解ObjectiveC中的协议,包括协议的声明、协议的遵守、协议的继承等。虽然协议的相关内容不多,但使用频率非常高,希望大家深刻理解协议的好处,并在后面的开发中灵活运用。
第10章主要讲解Foundation框架中的常见对象及其这些对象的常见操作,包括字符串、数组、字典、文件操作、日期处理等相关对象。通过本章的学习,希望读者独立使用Foundation框架开发应用程序。
在学习过程中,读者一定要亲自实践案例中的代码。如果不能完全理解书中所讲的知识,读者可以登录博学谷平台,通过平台中的教学视频进行深入学习。学习完一个知识点后,要及时在博学谷平台上进行测试,以巩固学习内容。另外,如果读者在理解知识点的过程中遇到困难,建议不要纠结于某个小点,可以先往后学习,通常来讲,看到后面对知识点的讲解或者其他小节的内容后,前面看不懂的知识点一般就能理解了。如果读者在动手练习的过程中遇到问题,建议多思考,厘清思路,认真分析问题发生的原因,并在问题解决后多总结。
致谢
本教材的编写和整理工作由传智播客教育科技股份有限公司完成,主要参与人员有吕春林、高美云、王晓娟、刘传梅、尹桥印、潘星、薛蒙蒙、郑瑶瑶、齐瑞华、郭敬楠等,全体人员在近一年的编写过程中付出了很多辛勤的汗水,在此一并表示衷心的感谢。
意见反馈
尽管我们尽了最大的努力,但教材中难免会有不妥之处,欢迎各界专家和读者朋友来信、来函提出宝贵意见,我们将不胜感激。阅读本书时,如发现任何问题或有不认同之处,可以通过电子邮件与我们取得联系。
黑马程序员
2017年5月于北京前言ObjectiveC程序设计案例教程
第1章ObjectiveC入门1
1.1ObjectiveC概述1
1.2搭建开发环境2
1.2.1开发环境要求2
1.2.2系统环境搭建2
1.2.3Xcode开发工具搭建3
1.3开发第一个ObjectiveC程序4
1.3.1使用Xcode开发ObjectiveC
程序4
1.3.2ObjectiveC程序代码分析7
1.3.3ObjectiveC源码、编译代码和
可执行文件8
1.4帮助文档的使用9
1.4.1帮助文档的下载安装9
1.4.2帮助文档的使用9
1.5本章小结12
1.6本章习题12
第2章面向对象编程(上)13
2.1面向对象概述13
2.2类和对象14
2.2.1类和对象之间的关系14
2.2.2类的设计15
2.2.3类的定义16
2.2.4使用Xcode创建一个类17
2.2.5类的对象的创建22
2.2.6访问对象的属性24
2.3方法25
2.3.1方法的声明实现和调用25
2.3.2方法实现中直接访问属性27目录ObjectiveC程序设计案例教程2.3.3对象作为方法的参数28
2.3.4对象作为方法的返回值31
2.4self的使用32
2.4.1在对象方法中使用self32
2.4.2在类方法中使用self35
2.5匿名对象37
2.6异常37
2.7阶段案例——猜拳游戏38
2.8本章小结43
2.9本章习题44
第3章面向对象编程(下)46
3.1面向对象的三大特征46
3.2封装47
3.2.1setter的封装47
3.2.2getter的封装49
3.3static关键字50
3.4继承51
3.4.1继承的简单使用51
3.4.2继承的特点53
3.4.3方法的重写56
3.4.4super关键字57
3.5访问修饰符59
3.6里氏替换原则59
3.7多态60
3.8description方法62
3.9阶段案例——计算器63
3.10本章小结67
3.11本章习题67
第4章ObjectiveC特有语法69
4.1点语法69
4.2@property72
4.3@synthesize73
4.4@property增强75
4.5静态类型与动态类型76
4.6动态类型检测78
4.7构造方法80
4.7.1构造方法概述80
4.7.2重写init构造方法81
4.7.3自定义构造方法82
4.8阶段案例——购票系统84
4.9本章小结92
4.10本章习题93
第5章内存管理99
5.1内存管理概述99
5.1.1引用计数器99
5.1.2第一个MRC程序101
5.2单个对象的内存管理105
5.3多个对象的内存管理(setter方法内存管理)106
5.3.1setter方法内存管理(一)109
5.3.2setter方法内存管理(二)111
5.3.3setter方法内存管理(三)115
5.4@property参数概述117
5.4.1@property参数之atomic与nonatomic118
5.4.2@property参数之retain与assign118
5.4.3@property参数之readwrite与readonly121
5.4.4@property参数之getter与setter121
5.5自动释放池126
5.6阶段案例——微博(MRC)127
5.7本章小结133
5.8本章习题133
第6章ARC机制138
6.1ARC机制概述138
6.2ARC机制下单个对象的内存管理139
6.3@property中的strong和weak140
6.4ARC机制下的循环引用141
6.5ARC与MRC的相互兼容145
6.6阶段案例——微博(ARC)147
6.7本章小结152
6.8本章习题153
第7章分类和延展156
7.1分类概述156
7.1.1分类的简单使用156
7.1.2分类的注意细节159
7.2非正式协议161
7.3延展163
7.4本章小结165
7.5本章习题165
第8章block169
8.1block概述169
8.1.1block语法169
8.1.2block的基本使用170
8.1.3使用typedef简化复杂的block定义172
8.2block内部访问外部变量173
8.3block作为函数的参数174
8.4block作为函数的返回值176
8.5本章小结177
8.6本章习题177
第9章协议182
9.1协议概述182
9.1.1协议的基本使用182
9.1.2@required和@optional185
9.2协议之间的继承185
9.3协议的类型限制186
9.4阶段案例——给男生找女友187
9.5本章小结190
9.6本章习题190
第10章Foundation框架194
10.1NSString的基本使用194
10.1.1NSString的创建194
10.1.2NSString最常见的操作195
10.2NSString的其他操作198
10.2.1字符串的读写198
10.2.2字符串的比较203
10.2.3字符串的开始和结束判断204
10.2.4字符串的搜索205
10.2.5字符串的截取207
10.2.6字符串的替换208
10.2.7字符串的类型转换209
10.3NSMutableString210
10.3.1NSMutableString概述210
10.3.2NSMutableString的使用210
10.4NSArray212
10.4.1NSArray数组的创建212
10.4.2NSArray数组的基本使用213
10.4.3NSArray数组的遍历215
10.5NSMutableArray的使用217
10.6NSDictionany219
10.6.1NSDictionary概述219
10.6.2NSDictionary字典的创建219
10.6.3NSDictionary的使用220
10.6.4NSDictionary字典的遍历221
10.7NSMutableDictionary的使用222
10.8NSFileManager224
10.8.1使用NSFileManager实现判断操作224
10.8.2使用NSFileManager获取信息226
10.8.3使用NSFileManager创建文件或文件夹229
10.9Foudation框架的结构体232
10.9.1CGPoint232
10.9.2CGSize233
10.9.3CGRect234
10.10NSValue235
10.11日期处理236
10.11.1字符串与时间的相互转换236
10.11.2日期计算237
10.11.3得到日期的各个部分239
10.12阶段案例——通讯录240
10.13本章小结248
10.14本章习题248
第5章内存管理学习目标
了解管理内存的概念,可以简述内存管理的重要性。
通过分析引用计数器的工作原理,学会对单个或者多个对象进行内存管理,避免程序开发中出现内存泄漏。
掌握@property参数的使用场景,可以准确为不同类型的属性设定参数。
理解自动释放池的作用,可以阐述自动释放池何时被创建和销毁。当OC程序运行时,会在手机的内存中产生很多临时的数据(变量,对象等),系统会将它们归纳分类,然后分配到内存的不同区域。在内存中有五大区域,具体如下:
(1) 栈区域: 保存局部变量。当局部变量的作用域被执行完毕以后,这个局部变量就会被系统立即回收。
(2) 堆区域: 保存OC对象。使用C函数申请的动态空间都是分配在堆里面的。
(3) BSS段: 保存未初始化的全部变量和静态变量。一旦初始化就会被回收,并且转入到数据段中。
(4) 数据段: 保存已经初始化的全局变量和静态变量。直到程序结束时才会被回收。
(5) 代码段: 程序结束时,系统会自动回收存储在代码段中的数据。
由于移动设备的内存是有限的,一旦占用量过大,势必造成卡顿或者闪退的情况。其中,栈区、BSS段、数据段和代码段存放的数据是由系统负责回收的,而堆中的对象系统不能自动回收,所以内存管理的范围是存放在堆中的OC对象。
为了让应用程序的内存消耗到最低,需要及时地清理无用的对象,但是需要确保清除的不是正在使用的对象。ObjectiveC中提供了MRC(Mannul Reference Counting,手动引用计数)和ARC(Automatic Reference Counting,自动引用计数)两种机制对内存中的对象进行管理,本章主要介绍MRC内存管理的相关知识。
5.1内存管理概述
当有人在使用某个对象时,它一定不能被回收,当没有人使用某个对象时,它才能被回收。这时需要有个计数的东西,随时统计此时使用对象的数量,为此提出了引用计数器的概念,本节将针对引用计数器进行详细介绍。
5.1.1引用计数器
为了记录每个对象被使用的情况,ObjectiveC为每个对象设置了一个内部计数器,称为引用计数器。当对象被创建时,让引用计数的值为1,每次对象被引用时,引用计数增加1,每次对象减少一次引用时,引用计数减1,直到引用计数器的值为0时,直接释放对象占用的内存。接下来,以现实中办公室使用电灯的例子,说明引用计数的原理,如图51所示。
图51引用计数原理示意图
图51介绍了引用计数的原理。假设有一个办公室(内存),有个人打开了办公室的灯(对象),此时使用电灯照明的人数(引用计数)为1;有人进入办公室,引用计数就增加1;有人离开办公室,引用计数就减少1;当最后一个人离开时,此时使用电灯照明的人数为0,需要关闭电灯,办公室停止使用。
第5章内存管理ObjectiveC程序设计案例教程知道了引用计数器的原理后,接着来操作引用计数器。在MRC(手动引用计数)机制中,提供了手动管理内存的方法,具体如下。
1. retainCount属性
每个对象内部都有retainCount属性,隶属于unsigned类型,占用4个字节。这就是引用计数器,用于记录当前对象被使用的次数。
2. retain方法
当对象发送一条retain消息(调用retain方法)时,该对象的引用计数器的值加1。例如,在办公室照明的例子中,有人进入办公室,使用电灯的人数增加1。
3. release方法
当对象发送一条release消息(调用release方法)时,该对象的引用计数器的值减1。例如,有人离开办公室,使用电灯照明的人数减少1。
4. dealloc方法
当对象的引用计数器的值变成0时,其占用的内存会被系统立即回收,同时系统会发送一条dealloc消息。例如,最后一个人离开办公室,关闭电灯,办公室不再投入使用。
多学一招: 内存管理分类——MRC和ARC机制
(1) MRC(手动引用计数)
当多一个人使用对象时,要求程序员手动地发送retain消息;当少一个人使用对象时,要求程序员手动地发送release消息。
(2) ARC(自动引用计数)
当多一个人使用对象时,系统会自动在合适的位置发送retain消息;当少一个人使用对象时,系统会自动在合适的位置发送release消息。
5.1.2第一个MRC程序
自Xcode 4.2开始支持ARC模式,默认不再使用MRC模式。假设要体验MRC模式开发,前提是需要在Xcode中关闭自动引用计数,具体步骤如下。
(1) 创建一个命令行工程,在打开的导航面板中,单击左侧的根目录,选择Build Settings→All,如图52所示。
……