[学习笔记—Objective-C]《Objective-C-基础教程 第2版》第二章~第七章
在看完《Objective-C 程序设计 第6版》之后,看了一些关于iOS开发职位的面试题,发现自身基础非常是不牢,于是打算以查缺补漏的方式阅读还有一本关于Objective-C的基础书籍:《Objective-C-基础教程 第2版》。
本套学习笔记主要仅仅是记录《Objective-C 程序设计 第6版》中未提到的知识点,因此看上去内容不是非常完整。
第二章 对c的扩展
2.1 import语句
- Objective-C使用头文件包括结构体,符号常量和函数原型等元素的声明。
- import可保证头文件仅仅被包括一次,不管此命令在该文件里出现多少次。
2.2 框架
- 框架:一种把头文件。库,图片,声音等内容聚集在一个独立单元中的集合体。
- 每一个框架都是一个重要的技术集合,通常包涵数十个甚至上百个头文件。
- 每一个框架都有一个主头文件,它包括了框架内全部的头文件。
- Foudation框架的头文件占用了近1M的存储空间。包括了14000多行代码,涵盖了100多个头文件。
2.3 布尔类型
- 假设个大于1字节的整形值(short或int)。仅仅有低位字节会用做BOOL值。
第三章 面向对象编程的基础知识
3.1 间接
- 间接:
- 代码中通过指针间接获取某个值。而不是直接获取。
- 通过“他人”取代你自己完毕工作。
3.11 通过变量的间接
- 将数字放入某个变量中,加入一层间接来解决这个问题,代码更加简洁,便于编辑。
3.12 通过文件的间接
- 将代码内容转移到代码之外的某个文本文件里。
3.2 面向对象编程中使用间接
- 间接是OOP的核心,OOP使用间接来获取数据。不适直接调用某个函数,而是间接调用。
3.21 过程式编程
- 你决定使用什么函数,然后调用它并传递其所需的数据。
- 处理过程式编程的时候。要花时间链接数据和用来处理该数据的函数,程序越复杂。扩展起来就越困难。
3.22 面向对象编程
面向对象编程以程序的数据为中心,让函数为数据服务。OOP中,不再重点关注程序中的函数。而是专注于数据。
给对象发送消息:
- 查出对象属于那个类。
- 找到类之后,在此类中找到方法(消息)。
- 运行该方法。
3.3 Objective-C 中的OOP
3.31 @interface 部分
- 实例变量:表示创建的新对象的组成元素。每一个新对象都有各自的实例变量。
- 假设方法须要參数。则须要冒号,否则不须要冒号。
3.32 @implementation部分
@implementation是一个编译器指令。表明你将为某个类提供代码。
在Objective-C中调用方法时,一个名为self的秘密隐藏參数将被传递给接收对象,而这个參数引用的就是该接收对象。
实例化:分配内存,将内存初始化,新的对象实例创建完毕。
id:指向随意类型对象的指针。
第四章 继承
4.1 为何使用继承
- 几个类的接口非常相似的时候,为了避免过多的内容反复,应该创建一个新类,它拥有这几个类同样的功能。
- UML(Unified Modeling Language):统一建模语言,是一种用图表表示类。类的内容以及他们之间关系的常见方式。
- 子类可获得父类的实例变量。可是,直接更改由继承得到的实例变量的值不是好习惯。一定要通过方法或property属性来更改。
4.2 继承的语法格式
@interface ClassA: NSObject
- C++具有多继承性,可是Objective-C通过类别和协议达到多继承的效果。
- 重构(refactoring):通过移植某些代码来改进程序的架构,通常开发周期包括向代码中加入某些特性,然后通过重构删除全部反复的代码。
- 重写(override):子类的某方法和父类的某方法一致的时候,会运行子类的方法(不使用
superkeyword的前提下)。
4.3 继承的工作机制
4.31 方法调度
- 当代码发送消息时,Objective-C的方法调度机制在当前的类中搜索对应的方法。假设无法在接受消息的对象的类文件里找到对应的方法,就会在对象的超类中进行查找。
- 接受消息的对象拥有一个指向当前类的指针,并且当前类也有一个指向响应代码(方法)的指针。并且该类也有指向其父类的指针。
4.32 实例变量
- 在创建一个新类时,其对象首先会从它的超类继承实例变量,然后更具自身情况加入自己的实例变量。
- 多态(polymorphism):使用更详细种类(Rectangle,Circle)的对象来取代一般的类型(Shape,父类),这样的能力被称为多态性。
- 每一个方法调用都获得了一个名为self的隐藏參数。它是一个指向接受消息的对象的指针。
4.4 重写方法
在制作子类的时,常常会加入方法
- 加入新方法
- 替换或者改进超类定义的原方法
重写方法的情况下,利用superkeyword调用超类中的实现方式:
[super method];
第五章 复合
5.1 什么是复合
- 复合(composition):在Objective-C中。复合通过包涵作为实例变量的对象指针实现的。注意:仅仅有对象间的组合才干叫复合。
5.2 自己定义NSLog()
- 对象作为实例变量时,仅仅是对象的引用指针,并非对象本身。
- 新建的对象(包括实例变量的对象)分配内存时,作为实例变量的对象(指针)将被初始化为nil。
5.3 存取方法
- setter方法:以属性名+前缀set命名。
- getter方法:以属性名命名。
- 若get出如今Cocoa的方法名称中。就意味着将传递的參数座位指针。
- Objective-C中全部对象间的交互都是通过指针实现的。
- 防御式编程(defensive programming):用于在开发早期及时发现错误。
5.4 扩展CarParts 程序(略)
5.5 复合还是继承
- 创建新对象时,先话时间想清楚用继承还是复合。
- 继承的关系:“is a”。Rectangle is a shape
- 复合的关系:“has a”,Rectangle has a color
第六章 源文件组织
6.1 拆分接口和实现
- 编译器将@interface部分编译后。才干使用该类的对象,调用该类的方法。将对象复合到其它类中,以及创建子类
- @implementation部分告诉编译器怎样让该类工作
6.2 拆分Car程序 (略)
6.3 使用跨文件依赖关系
- 依赖关系(dependency)是两个实体之间的一种关系。
- 导入头文件使头文件和源文件之间建立了一种紧密的依赖关系。假设头文件有变化,那么全部依赖它的文件都得又一次编译。
6.31 又一次编译须知
- 有时候编译器须要知道类的全部信息,有的时候编译器仅仅知道类名就可以。
- @class告诉编译器:这是一个类,所以我仅仅会通过指针来引用它。
- 两个类互相引用,则会出现编译错误
- 在子类的接口文件里,须要导入其超类的接口文件(#import而非@class),由于子类须要了解其超类中实例变量的配置信息。
第七章 深入了解Xcode
7.1~7.3 略
7.4 在Xcode的帮助下编写代码
- 首行缩进:Command+I
- 选定代码左右移:Command+[ 和 Command+]
- 接受代码提示:tab
- 启动代码提示:esc
- 代码提示翻页:Control+. / Shift+Control+.
- Snapshort:Command+Control+S
- 查找替换:Command+shift+f
- 更改类名:Edidt->Refactor->Rename
- 代码折叠(code folding)
- 高速帮助:Option+单击
- 文档查询:Option+双击
7.5 调试
7.51 暴力測试
- 暴力測试(caveman debugging):程序中写入输出语句来输出程序的控制流程和一些数据值。
7.52 Xcode 调试器
- 调试器(debugger):位于编写的程序和操作系统指之间的程序。它可以中断程序。
[学习笔记—Objective-C]《Objective-C-基础教程 第2版》第二章~第七章的更多相关文章
- HTML5与CSS3基础教程(第8版) PDF扫描版
<HTML5与CSS3基础教程(第8版)>自第1版至今,一直是讲解HTML和CSS入门知识的经典畅销书,全面系统地阐述HTML5和CSS3基础知识以及实际运用技术,通过大量实例深入浅出地分 ...
- ASP.NET MVC 学习笔记-2.Razor语法 ASP.NET MVC 学习笔记-1.ASP.NET MVC 基础 反射的具体应用 策略模式的具体应用 责任链模式的具体应用 ServiceStack.Redis订阅发布服务的调用 C#读取XML文件的基类实现
ASP.NET MVC 学习笔记-2.Razor语法 1. 表达式 表达式必须跟在“@”符号之后, 2. 代码块 代码块必须位于“@{}”中,并且每行代码必须以“: ...
- JavaSE学习笔记(2)---面向对象基础
JavaSE学习笔记(2)---面向对象基础 1.面向对象具有三大特征:封装性.继承性和多态性,而面向过程没有继承性和多态性,并且面向过程的封装只是封装功能,而面向对象可以封装数据和功能.所以面向对象 ...
- 《HTML5与CSS3基础教程(第8版)》
<HTML5与CSS3基础教程(第8版)> 基本信息 原书名:HTML and CSS:visual quickstart guide 作者: (美)Elizabeth Castro ...
- HTML5与CSS3基础教程(第7版) 高清PDF扫描版
HTML5与CSS3基础教程(第7版)试读不仅介绍了文本.图像.链接.列表.表格.表单.多媒体等网页元素,也介绍了如何为网页设计结构.布局,添加动态效果.格式化等形式,此外还涉及调试和发布.聚合和吸引 ...
- 推荐《SQL基础教程(第2版)》中文PDF+源代码+习题答案
我认为<SQL基础教程(第2版)>非常适合数据库学习的初学者.论述的角度是读者的角度,会换位思考到读者在看到这一段时候会发出怎样的疑问,非常难得:原始数据的例题只有一道,但是可以反复从不同 ...
- .NET CORE学习笔记系列(2)——依赖注入[4]: 创建一个简易版的DI框架[上篇]
原文https://www.cnblogs.com/artech/p/net-core-di-04.html 本系列文章旨在剖析.NET Core的依赖注入框架的实现原理,到目前为止我们通过三篇文章从 ...
- Python基础教程-第3版(文字版) 超清文字-非扫描版 [免积分、免登录]
此处免费下载,无需账号,无需登录,无需积分.收集自互联网,侵权通知删除. 点击下载:Python基础教程-第3版 备用下载:Python基础教程-第3版
- 嵌入式LINUX基础教程 第2版
嵌入式LINUX基础教程 第2版 目录 第1章 入门 11.1 为什么选择Linux 11.2 嵌入式Linux现状 21.3 开源和GPL 21.4 标准及相关组织 31.4.1 Linux标准基 ...
- Python基础教程(第2版 修订版) pdf
Python基础教程(第2版 修订版) 目录 D11章快速改造:基础知识11.1安装Python11.1.1Windows11.1.2Linux和UNIX31.1.3苹果机(Macintosh)41. ...
随机推荐
- ACM_变形课(并查集)
变形课 Time Limit: 2000/1000ms (Java/Others) Problem Description: 呃......变形课上Harry碰到了一点小麻烦,因为他并不像Hermio ...
- ACM_无聊者序列(斐波那契数列大数取余(同余)+规律)
Problem Description: 瓜瓜在玩着由红色和蓝色的大理石做成的玻璃珠,他将n个玻璃珠从左到右排成一个序列叫做无聊者序列.一个非空的红色和蓝色玻璃珠组成的序列是一个无聊者序列.这个序列的 ...
- Flume 是什么?
Flume是一个分布式.可靠.和高可用的海量日志聚合的系统,支持在系统中定制各类数据发送方,用于收集数据:同时,Flume提供对数据进行简单处理,并写到各种数据接受方(可定制)的能力. 收集.聚合事件 ...
- 使用Jquery.form.js ajax表单提交插件弹出下载提示框
现象: 使用jquery的from做ajax表单提交的时候,后台处理完毕返回json字符串,此时浏览器提示下载一个json文件而不是在success里面继续解析该json对象. 具体的原因: 浏览器兼 ...
- MVC系列学习(二)-初步了解ORM框架-EF
1.新建 一个控制台项目 2.添加一个数据项 a.选择数据库 注:数据库中的表如下: b.选择EF版本 c.选择表 3.初步了解EF框架 看到了多了一个以 edmx后缀的文件 在edmx文件上,右击打 ...
- CF831C Jury Marks
思路: 关键在于“插入”一个得分之后,其他所有得分也随之确定了. 实现: #include <iostream> #include <cstdio> #include < ...
- Android开发高手课 - 02 崩溃优化(下):应用崩溃了,你应该如何去分析?
崩溃现场 1. 崩溃信息 进程名.线程名 崩溃类型和堆栈信息 2. 系统信息 Logcat 机型.系统.厂商.CPU.ABI.Linux 版本等 设备状态:是否 root.是否模拟器.是否有 Xpos ...
- c++中std::set自定义去重和排序函数
c++中的std::set,是基于红黑树的平衡二叉树的数据结构实现的一种容器,因为其中所包含的元素的值是唯一的,因此主要用于去重和排序.这篇文章的目的在于探讨和分享如何正确使用std::set实现去重 ...
- [文章转载]-Java后端,应该日常翻看的中文技术网站 -江南白衣
Java后端,应该日常翻看的中文技术网站 1.内容生产者 InfoQ 中文技术第一站,佩服霍老板,真金白银地为中国程序员们生产内容. ImportNew 专门面向Java的内容生产者兼聚合者,偶然也有 ...
- querySelector
this.el.nativeElement.querySelector import {Component, ElementRef, OnInit} from '@angular/core';