当前位置: 首页 > news >正文

[学习笔记—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中,不再重点关注程序中的函数。而是专注于数据。

  • 给对象发送消息:

    1. 查出对象属于那个类。
    2. 找到类之后,在此类中找到方法(消息)。

    3. 运行该方法。

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):位于编写的程序和操作系统指之间的程序。它可以中断程序。

相关文章:

  • MongoDB入门(二)——MongoDB下载与安装
  • 基于阿里云移动推送的移动应用推送模式最佳实践
  • centos7设置静态IP
  • 64位x86的函数调用栈布局
  • 纯文本配置还是注册表
  • “你的优势是什么?
  • 记录项目代码迁移后,UI测试框架的搭建(配置文件的修改、测试脚本试运行)...
  • QComboBox 树形视图选择
  • 用户28万、营收超1亿,《生化危机》给VR游戏做了个好榜样
  • 验证数据过程中碰到的问题记录
  • Python--多进程
  • IE安全系列之:中流砥柱(I)—Jscript 5处理浅析
  • python一条语句分析几个常用函数和概念
  • 使用strtok_s函数从一个字符串中分离出单词
  • Android Studio_更新Gradle
  • 【个人向】《HTTP图解》阅后小结
  • Android 控件背景颜色处理
  • Hibernate【inverse和cascade属性】知识要点
  • Linux CTF 逆向入门
  • PHP的类修饰符与访问修饰符
  • Python实现BT种子转化为磁力链接【实战】
  • React Transition Group -- Transition 组件
  • Shell编程
  • Transformer-XL: Unleashing the Potential of Attention Models
  • Vue--数据传输
  • 更好理解的面向对象的Javascript 1 —— 动态类型和多态
  • 海量大数据大屏分析展示一步到位:DataWorks数据服务+MaxCompute Lightning对接DataV最佳实践...
  • 前端自动化解决方案
  • 前嗅ForeSpider中数据浏览界面介绍
  • 区块链将重新定义世界
  • 怎样选择前端框架
  • 栈实现走出迷宫(C++)
  • 做一名精致的JavaScripter 01:JavaScript简介
  • # C++之functional库用法整理
  • #gStore-weekly | gStore最新版本1.0之三角形计数函数的使用
  • #if 1...#endif
  • #鸿蒙生态创新中心#揭幕仪式在深圳湾科技生态园举行
  • #在 README.md 中生成项目目录结构
  • (3)STL算法之搜索
  • (3)选择元素——(17)练习(Exercises)
  • (Redis使用系列) Springboot 在redis中使用BloomFilter布隆过滤器机制 六
  • (SpringBoot)第七章:SpringBoot日志文件
  • (附源码)springboot炼糖厂地磅全自动控制系统 毕业设计 341357
  • (附源码)ssm高校升本考试管理系统 毕业设计 201631
  • (使用vite搭建vue3项目(vite + vue3 + vue router + pinia + element plus))
  • (四)库存超卖案例实战——优化redis分布式锁
  • (转)创业家杂志:UCWEB天使第一步
  • (转)甲方乙方——赵民谈找工作
  • (转载)hibernate缓存
  • *(长期更新)软考网络工程师学习笔记——Section 22 无线局域网
  • *ST京蓝入股力合节能 着力绿色智慧城市服务
  • .apk 成为历史!
  • .net CHARTING图表控件下载地址
  • .NET 使用 ILRepack 合并多个程序集(替代 ILMerge),避免引入额外的依赖
  • .NET/C# 判断某个类是否是泛型类型或泛型接口的子类型