OC总结(二)

2016-07-16  本文已影响0人  李毅然

一.内存问题
(1).内存溢出
(2).野指针(过度释放)
二.内存管理方式:

(1)MRC:手动管理引用计数.对对象完成后需要release.
Man * man = [[Man alloc]init];
[man release];

// 集合类型
(i). addObject 会使引用计数 + 1
(ii).removeObject 会使引用计数 - 1

(2).ARC:自动管理引用计数(常用.基于MRC)

(i).strong (ARC,强引用) 会使引用计数 + 1
(ii).weak (应用于对象类型(NSObject子类),弱引用,对象被释放时,会自动置空)
(iii).retain(MRC,强引用)会使引用计数 + 1
(iv).copy(拷贝)原来引用计数不变,新生成的 + 1
(v).assign(用户与简单的数据类型,不会产生引用计数)
三.引用计数
(1).alloc,copy,retain 会使引用计数 + 1
(2).release,autorelease 会使引用计数 - 1
(3)当引用计数 = 0 时,会调用dealloc方法 引用计数不变(为1)
四.实现对对象的拷贝
(1).需要签订NSCoping协议
(2).需要实现copyWithZone方法

Man * newMan = [man copy];
NSLog(@"newMan : %@ - oldMan : %@",newMan,man);

五.KVC(NSObject) Key-Value-Coding键值编码,间接访问成员变量的方式
六.只要是NSObject的子类,就包含以下方法
(1)valueForKey
(2) valueForKeyPath
(3) setValue: forKeyPath:
七.在工程下使用文件
// 加在Build Phases下的编译source下
(1).如果在ARC工程下使用MRC的文件
-fno-objc-arc
(2). 在MRC的工程下使用ARC的文件
-fobjc-arc
三.类的扩展方式
(1).category(类目)
创建:

屏幕快照 2016-07-16 下午2.55.05.png
屏幕快照 2016-07-16 下午2.55.59.png

(i).通过Objective-C File创建
(ii).会产生两个文件 .h .m
(iii).文件名会以 类名+Category名
使用:
(i). 向对应文件中添加需要添加方法
(ii). 引入到你对应要使用的位置
(2).extends(延展)
延展,一般定义在.m中,其中声明一些私有的属性/方法
(3).delegate(代理)
在之前简书上已整理
(4).继承
四.iOS9的新特性
(1).nonnull 修饰的属性,对应setter和getter方法
(2).nullable 修饰的属性,对应setter和getter方法
(3).null_resetable
五.泛型(带泛型的容器(规定了容器中所存储的类型))
(1).泛型数组

 NSMutableArray<NSString *> * array = [NSMutableArray arrayWithObjects:@"123", nil];

(2).泛型字典

NSMutableDictionary<NSString *,NSString *> * dic = [NSMutableDictionary dictionaryWithObjectsAndKeys:@"小花儿",@"name", nil];

(3).自定义泛型

Truck<Pserson *> * truck = [[Truck alloc]init];

Truck.h

// 自定义泛型声明方式
//@interface 类名<泛型名>: 父类
// 自定义泛型,声明后,泛型名,可以应用在属性,方法中
// 泛型名 等效于 类型修饰(例: NSString *)
@interface Truck<__covariant objectType> : NSObject

六.协变性,逆变性
(1). __covariant 协变性 子类在给父类赋值时,自动强转

//Truck<NSArray*> Truck<NSMutableArray*>
  truck1 = truck2;

(2).__contravariant 逆变性 父类给子类赋值,自动强转(暂时不知道应用何处)

    truck2 = truck1;

七.__kindOf
加__kindof修饰后,返回的类型及其子类型,都可以接收这个返回值

 Truck * truckKindOf = [[Truck alloc]init];
NSMutableArray * arr = [truckKindOf returnArray];

Truck.h

-(__kindof NSArray *)returnArray;

Truck.m

// 方法的返回值,是一个不可变数组/可变数组
-(__kindof NSArray *)returnArray{
//    return @[];
return [NSMutableArray array];
}
上一篇 下一篇

猜你喜欢

热点阅读