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

半路出家, 我的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 >

  • 成员变量
    1. 必须在类里面声明
    2. 成员变量名,以下划线”_”开头
// .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 的参数
  1. 跟 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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值