OC 基础 2019-08-14
2019-08-14 本文已影响0人
金樽明月
学习路线图

- ARC 只是 OC 编译器的一个特性,编译器自动在合适的地方加上了release或autorelease ,不是 运行时的垃圾回收机制。
- ARC 的特点:
1)不允许调用release,retain,retainCount
2)允许重写dealloc,但是不允许调用[super dealloc]
3)@property的参数:
strong:相当于原来的retain(适用于OC对象类型),成员变量是强指针
weak:相当于原来的assign,(适用于oc对象类型),成员变量是弱指针
assign:适用于非OC对象类型(基础类型) - 分类 Category
作用:在不改变原来类的基础上,为类扩充一些方法。(类似 js 中直接在原型上添加方法,但是 js 不推荐,不容易管理)
注意事项:- 只能添加方法,不能添加属性
- 分类的调用顺序:调用最后一个参与编译的分类
- 分类和类扩展的区别:
1、类别中只能增加方法;
2、是的,你没看错,类扩展不仅可以增加方法,还可以增加实例变量(或者合成属性),只是该实例变量默认是私有类型的(作用范围只能在自身类,而不是子类或其他地方);
3、类扩展中声明的方法没被实现,编译器会报警,但是类别中的方法没被实现编译器是不会有任何警告的。这是因为类扩展是在编译阶段被添加到类中,而类别是在运行时添加到类中。
4、类扩展不能像类别那样拥有独立的实现部分(@implementation部分),也就是说,类扩展所声明的方法必须依托对应类的实现部分来实现。
5、定义在 .m 文件中的类扩展方法为私有的,定义在 .h 文件(头文件)中的类扩展方法为公有 的。类扩展是在 .m 文件中声明私有方法的非常好的方式。 - block
oc 特有的一种数据类型。被 block 访问的外部变量需要用 __block 修饰 - Protocol
- @required 和 @optional
- id和instancetype的区别
1)instancetype只能作为函数或者方法的返回值
2)id能作为方法或者参数的数据类型、返回值,也能用来定义变量。
3)instancetype对比id的好处:
能精确的限制返回值的具体类型。
- Fundation 框架
- NSString、NSMutableString、NSURL、NSRange、NSNumber、NSValue、NSDate
- NSArray
1> 只能存放任意OC对象, 并且是有顺序的。
2> 不能存储非OC对象,比如int\float\double\char\enum\struct等。
3> 它是不可变的,一旦初始化完毕后,它里面的内容就永远是固定的, 不能删除里面的元素, 也不能再往里面添加元素.
4> makeObjectsPerformSelector
5> enumerateObjectsUsingBlock - NSDictionary
- NSFileManager
- iOS 沙盒机制
- Copy 概念:
- 需要遵守对应的协议,比如: NSCopying。也有 mutableCopy
- 只有源对象和副本对象都不可变时,才是浅复制,其它都是深复制
- @property 的内存管理策略
1> copy : 只用于NSString\block
2> strong : 除NSString\block以外的OC对象
3> weak : 当2个对象相互引用,一端用strong,一端用weak
4> assgin : 基本数据类型、枚举、结构体(非OC对象)
- OC 中的单例模式
``Tools.h
import <Foundation/Foundation.h>
@interface Tools : NSObject<NSCopying>
@property (nonatomic,assign) int num;
@property (nonatomic,copy) NSString *text;
- (instancetype)shareIntances;
@end
Tools.m
import "Tools.h"
static Tools *instance = nil;
@implementation Tools
- (instancetype)shareIntances
{
if (instance==nil) {
instance = [[self allocWithZone:NULL] init];
}
return instance;
}
- (id)copyWithZone:(NSZone *)zone
{
return self;
}
- (id)allocWithZone:(NSZone *)zone
{
@synchronized(self)
{
if (instance == nil)
{
instance = [super allocWithZone:zone];
return instance;
}
}
return instance;
}
-(id)retain
{
return self;
}
-(NSUInteger)retainCount
{
return NSUIntegerMax;
}
-(oneway void)release
{
}
-(id)autorelease
{
return self;
}
@end``