标签:
------- iOS培训、Android培训、Java培训、期待与您交流! ----------
【ARC概念】
1、指针的分类
1)强指针,默认的情况下,所有的指针都是强指针,关键字strong;
2)弱指针,_ _weak关键字修饰符的指针
2、ARC概念
自动引用计数
永远不要写retain和release、autorelease三个关键字
编译器会在编译的时候自动插入retain和release、autorelease,
是一个编译器的特性;“垃圾回收”是运行时的特性
3、ARC工作原理
ARC是编译器特性,不是运行时特性,
ARC的判断准则
只有没有强指针指向对象,对象就会被释放
注意:当使用ARC时,不要用引用计数器相关方法;
4、ARC机制图解
强指针直接释放,若指针会指向nil;
5、ARC机制判断
1)不允许调用retain方法
2)不运行调用autorelease方法
3)重写父类的dealloc方法时,不能再调用super方法;
6、ARC机制的快速使用
默认的自动释放;正常创建对象,不用手动释放
【ARC对象内存管理】
1、ARC工作原理
是一个编译器特性,在编译的时候自动加retain方法
ARC准则
只要没有强指针指向的对象就会释放对象内存
2、ARC单对象内存管理
1 #import <Foundation/Foundation.h> 2 3 #import "Car.h" 4 5 int main(int argc, const char * argv[]) { 6 7 @autoreleasepool { 8 9 //在ARC下对象释放判断依据:对象没有强指针指向 10 11 Car * ca = [Car new]; 12 13 // *ca指针已经重新指向nil空了,所有没有强指针指向对象,所以会立即释放 14 15 // 定义另一个强指针指向,ca = nil;不会自动释放 16 17 // Car * ca1 = ca; 18 19 // 定义另一个弱指针指向,ca = nil;会自动释放(根本原因是:没有强指针指向对象,所以自动释放) 20 21 __weak Car * ca1 = ca; 22 23 ca = nil; 24 25 [ca run];//相当于[nil run]; 26 27 //}号之后*ca指针被释放销毁,所以对象没有强指针指向,所以被自动释放 28 29 } 30 31 NSLog(@"test"); 32 33 return 0; 34 35 } 36 37 2015-10-07 14:20:30.214 04-ARC单对象内存管理[6703:5524825] Car run 38 39 2015-10-07 14:20:31.881 04-ARC单对象内存管理[6703:5524825] Car dealloc 40 41 2015-10-07 14:20:33.070 04-ARC单对象内存管理[6703:5524825] test
3、ARC多对象内存管理
1 #import <Foundation/Foundation.h> 2 3 @class Dog; 4 5 @interface Person : NSObject 6 7 //在ARC机制下,不能使用retain 8 9 //可以使用strong和weak; 10 11 @property (nonatomic,weak) Dog *dog; 12 13 @end 14 15 16 //将person类和dog类之间用指针连接 17 18 p.dog = d; 19 20 //weak是一个弱指针,所以当d = nil后,会释放dog对象内存 21 22 d = nil; 23 24 //将person类和dog类之间用指针连接 25 26 p.dog = d; 27 28 //strong是一个强指针,所以当d = nil后,不会立即释放dog对象内存,因为还有person类强指针指向 29 30 d = nil;
你有我,我有你。之间有连接时:
1)两个对象是强指针连接时候,只要一个有强指针连接就不会释放
2)两个对象是弱指针连接时候,被连接的对象,没有强指针时会自动释放内存
4、ARC下循环引用问题
相互引用A<--->B
1 Dog *d = [Dog new]; 2 3 Person *p = [Person new]; 4 5 //构成了循环引用,互相的强指针指向,内存无法自动释放,虽然p,d被释放,可是两个对象还是强指针互相指的 6 7 p.dog = d; 8 9 d.owner =p; 10 11 解决方法是,一端设置为weak弱指针,一端设置为strong,就可以释放内存了,不会造成内存泄露 12 13 //在ARC机制下,不能使用retain 14 15 //可以使用strong和weak; 16 17 @property (nonatomic,weak) Dog *dog;
5、*ARC下set方法@property参数
1)原子性和MRC一致
2)读写和MRC一致
3)set方法
MRC ARC
assign assign和MRC一致
retain strong(强指针)OC其他的对象 相当于MRC中retain
copy weak (弱指针)UI控件,界面按钮,图片 相当于MRC中assign
copy(一般用于NSString)和MRC一致
6、ARC的特定总结
1)不容许调用retain,release,autorelease方法
2)允许重写dealloc方法,不可以的super
3)@property参数,strong,weak
7、ARC使用注意
1)ARC中,只要弱指针指向的对象不在了,就直接把弱指针做清空,赋值为nil操作,不会造成野指针
2)__weak Dog *d1 = [Dog new];这么写是不对得
// 1)new一个对象
// 2)弱指针d1指向
// 会立即释放,然后把指针d1=nil,是不合理的
__weak Dog *d1 = [Dog new];
3)ARC中@property参数,strong,weak
8、ARC的兼容和转换
1)将MRC转换为ARC
考虑循环引用问题,一端使用strong一端使用weak
edit选项里面自动转换to arc
2)让程序兼容ARC和非ARC部分,转换为非ARC -fno - objc -arc 转变为ARC的,-f-bojc-arc
【分类Category】
1、分类概念
Category有很多翻译:分类、类别、类目
是OC特有语法,类似于扩展方法和partial;
2、分类的作用
1)在不修改原有类的基础上增加新的方法
2)一个庞大的类可以分模块开发、
3)一个庞大的类可以由多个人来编写,更有利于团队合作
3、使用分类的目的
1)对现有类进行扩展
2)作为子类的替代手段
不需要定义子类,通过类别直接向类增加新方法
3)对类中的方法归类
把一个庞大的类划分为小块来分别进行开发
4、使用分类的步骤
先声明分类-----实现分类------使用分类
注意:分类的命名规则:类名+扩展方法(分类名称)
分类的接口声明与类的定义十分相似,但分类不能继承父类,只需要带有一个括号,表明该分类的主要用 途
5、分类的声明实现
1 分类格式 2 3 1)声明: 4 5 @interface 待扩展的类名(分类的名称) 6 7 8 9 @end 10 11 举例: 12 13 Person +base ---》分类文件的命名规则 14 15 eat run 16 17 如: 18 19 声明 20 21 @interface Person (base) 22 23 //吃 24 25 -(void)eat; 26 27 //跑 28 29 -(void)run; 30 31 @end 32 33 34 35 2)实现: 36 37 @implementation 待扩展的类(分类的名称) 38 39 40 41 @end 42 43 如: 44 45 @implementation Person(base) 46 47 //吃 48 49 -(void)eat{ 50 51 NSLog(@"人会吃"); 52 53 } 54 55 //跑 56 57 -(void)run{ 58 59 NSLog(@"人会跑"); 60 61 } 62 63 @end 64 65 #import <Foundation/Foundation.h> 66 67 #import "Person.h" 68 69 #import "Person+playGame.h" 70 71 #import "Person+study.h" 72 73 int main(int argc, const char * argv[]) { 74 75 @autoreleasepool { 76 77 Person *p = [Person new]; 78 79 [p run]; 80 81 [p eat]; 82 83 [p playDota]; 84 85 [p playLol]; 86 87 [p study]; 88 89 } 90 91 return 0; 92 93 }
引用分类头文件,正常调用;
6、分类使用注意事项;
1)分类只能增加方法,不能增加成员变量,也不能用@property
2)可以在分类方法中访问原来类成员变量
3)分类和原类方法同名,优先调用分类方法
4)在多个类别种有同名方法的时候,执行的最后编译的那个类别的同名方法,不考虑原类的同名方法,最后编 译的最优先
*7、分类非正式协议
1)非正式协议
相对于正式协议而言
非正式协议通常定义为NSObject的类别,
所谓的非正式协议就是类别,凡是NSObject或其子类Foundation框架中的类增加的类别,都是非正式协 议;
NSString +countNum 类别,非正式协议
Dog +run 普通类别
1 [str characterAtIndex:i]把字符串分配一个下标取第i小标的值的方法; 2 3 //可以用self 4 5 -(void)countNum:(NSString*)str{ 6 7 int count=0; 8 9 for (int i=0;i<str.length; i++) { 10 11 if ([str characterAtIndex:i]>=‘0‘&&[str characterAtIndex:i]<=‘9‘){ 12 13 count++; 14 15 16 17 } 18 19 } 20 21 NSLog(@"阿拉伯数字个数= %d",count); 22 23 } 24 25 @end
8、分类延展
1)类的延展概念
延展类别又称为扩展
是分类的一个特例
其名字为匿名(为空),并且新添加的方法一定要给予实现(分类没有这个限制)
这种写法的类别叫匿名类别,又叫类扩展,所谓的扩展,其实就是为一个类添加额外的原来没有的变量, 方法,或者合成属性
格式:@interface 原类名()
@end
2)特点:
(1)可以在延展中定义实例变量和方法
(2)不能使用@implementation 类名()实现类别的方法,必须在原类中实现
(3)可以定义私有变量和方法,不能被子类继承
3)延展的实现
通过延展来实现方法的私有
黑马程序员---OC基础7【ARC概念】【ARC对象内存管理】【分类Category】
标签:
原文地址:http://www.cnblogs.com/snowimba/p/4859180.html