码迷,mamicode.com
首页 > 其他好文 > 详细

黑马程序员---OC基础7【ARC概念】【ARC对象内存管理】【分类Category】

时间:2015-10-07 20:19:06      阅读:329      评论:0      收藏:0      [点我收藏+]

标签:

------- iOS培训、Android培训、Java培训、期待与您交流! ----------

 

【ARC概念

 

1、指针的分类

1)强指针,默认的情况下,所有的指针都是强指针,关键字strong;

2)弱指针,_ _weak关键字修饰符的指针

 

2ARC概念

自动引用计数

永远不要写retain和release、autorelease三个关键字

编译器会在编译的时候自动插入retain和release、autorelease,

是一个编译器的特性;“垃圾回收”是运行时的特性

3ARC工作原理

ARC是编译器特性,不是运行时特性,

ARC的判断准则

只有没有强指针指向对象,对象就会被释放

注意:当使用ARC时,不要用引用计数器相关方法;

 

4ARC机制图解

技术分享

强指针直接释放,若指针会指向nil;

 

5ARC机制判断

1)不允许调用retain方法

2)不运行调用autorelease方法

3)重写父类的dealloc方法时,不能再调用super方法;

 

6ARC机制的快速使用

默认的自动释放;正常创建对象,不用手动释放

 

 

【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 (base22 
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(base46 
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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!