半路出家, 我的iOS自学之路-2-头文件, 属性, 引用计数, 协议, 类别, 类扩展

xiaoxiao2021-02-28  45

半路出家, 我的iOS自学之路-2-头文件, 属性, 引用计数, 协议, 类别, 类扩展

只学过Java, 半路出家, 自学iOS. 以下是我读完《Objective - C 编程》(第2版)的读书笔记博客中出现任何差错, 遗漏, 还请您在评论中告诉我群号:(空), 欢迎自学iOS的人加入, 一起交流, 共同成长

.h文件

也叫 头文件, 可定义 类, 协议, 类别, 声明 成员变量, 属性, 方法

.m文件

也叫 实例文件, 初始化 变量, 实现 方法 的地方

因为 Objective-C是C语言的母集合, 所以 .h 和 .m 文件支持OC和C的混编.

.mm文件

也叫 实例文件, 初始化 变量, 实现 方法 的地方

.mm 文件还支持C++混编, 就也就是 .m 和 .mm 的区别.

#import “” 和 #import < >

双引号 : 编译器会现在 当前项目下 查找文件, 没找到, 再到 资源库 中查找; 尖括号 : 编译器会先在 资源库 中查找文件, 没找到, 再到 当前项目下 查找文件.

@class

当你在头文件声明某种类型的变量的时候, 这个时候你并不需要知道这个类型的具体内容, 你只需要告知 编译器 你有这个类型就行了.

在 .m文件 中再用 “#import” 去引入这个类型的 .h文件

这么做的好处是, 加快编译速度, 减少重复导入的次数


OC里面的一些规则

- 类

(以”@”开头, @代表“Objective-C”的标志,证明您正在使用objective-c语言) 类名 : 父类名 (类别) <协议>

// 类名 : 父类名 (类别) <协议> @interface CNMe : CNFa (CNBig) < CNMeDelegate >

成员变量 必须在类里面声明成员变量名,以下划线”_”开头 // .h 头文件 @interface A : NSObject { NSInteger _intA; NSString *_strA; } @end 属性

第一种 : 手动 声明并实现 getter / setter

/* .h 头文件 */ @interface A : NSObject { NSInteger _intA; } - (void)setIntA:(NSInteger)intA; // setter 的 方法声明 - (NSInteger)intA; // getter 的 方法声明 @end /* .m 实例文件 */ @implementation A - (void)setIntA:(NSInteger)intA { // setter 的方法实现 _intA = intA; } - (NSInteger)intA { // getter 的方法实现 return _intA; } @end

第二种 : 用编译器指令自动生成属性

@property (参数) 类型 变量名;

/* .h 头文件 */ @interface A : NSObject { NSInteger _intA; } // 以"@"开头, @代表“Objective-C”的标志,证明您正在使用objective-c语言 @property (nonatomic, strong) NSInteger intA; @end /* .m 实例文件 */ @implementation A @end

@property 的参数

跟 OC 的 “引用计数” 有关的参数 参数名效果缺点使用场景retain得到对象的指针, 对象的 “引用计数” +1手动发送 retainCount 消息, 可以得到对象的 “引用计数”; 手动发送 release 消息, 使对象的 “引用计数” -1;当对象的 “引用计数” 为0时, 系统自动像该对象发送 dealloc 消息释放对象占用的资源手动内存管理模式assign只得到对象的指针, 对象的 “引用计数” 不会增加当对象销毁后, 需要手动为所有引用这个对象的变量设置值NULL, 否则会造成悬浮指针手动内存管理模式. 声明 int, flort 等 计数类型的的变量时使用.strong得到对象的”强引用”, 对象的 “引用计数” +1, “强引用” 不断开, 资源不会自动释放在 blcok 中使用 self 时, 会造成”强引用循环”, 对象占用的资源无法正常被释放, 造成内存泄漏ARC模式(又叫”自动引用计数”机制)week得到对象的”弱引用”, 对象的 “引用计数” 不变, 当对象的所有”强引用”断开, 对象占用的资源会自动被释放, “弱引用”的变量自动赋值nil, 避免出现悬浮指针不会保留对象ARC模式, 消除 “强引用循环”copy复制对象并返回新的地址回来, 新对象的 “引用计数” +1, 复制”不可变”的对象时, 编译器会有内部优化, 实际效果跟 strong 一样返回的对象都是”不可变”对象, 比如属性是”可变”数组, copy之后返回的是”不可变”数组ARC模式

2. 跟 getter / setter 有关的参数

参数名效果getter=给属性的getter方法重命名setter=给属性的setter方法重命名

协议

协议名 < 父协议 > 协议 可以在 协议 之间继承, 每一个 协议 都必须是 < NSObject > 协议 的 子协议;

@protocol CNMeDelegate <NSObject> /* 协议里面只能定义方法, 类似 Java 里的 接口 */ @end

类别 (小括号中的内容于2018-04-08添加: OC的”类别”与Ruby中的”模板”的概念和用法非常相识, 本质上都是用来存放”方法的定义”)

类名 (类别名) .h文件

@interface CNMe (CNBig) /* 类别 只能为指定的 类 添加方法, 可以添加 类方法 和 实例方法, 但是有的高手会利用 OC 里的 <objc/runtime.h> 的 "运行时" 机制, 实现用 类别 向 类 里添加 属性. */ // 这里是在 为 CNMe类 添加 方法的声明. @end

.m文件

@implementation CNMe (CNBig) // 这里是在 为 CNMe类 添加 方法的实现. @end

类扩展

类名 () 类扩展,看上去像没有 类别名 的 类别, 但实际用途, 更多的是放在.m文件中, 并且放在 @implementation 上面, 起到声明 私有属性, 私有方法 的作用

@interface CNMe () /* 将 类扩展 放入对应的 类 的 类的实现 上面, 扩展该 类 的 私有属性, 私有成员变量, 私有方法 */ @end @implementation CNMe @end
转载请注明原文地址: https://www.6miu.com/read-2623242.html

最新回复(0)