黑马程序员-[OC]学习之旅-ARC机制和类别

来源:互联网 发布:手机淘宝双色球在哪里 编辑:程序博客网 时间:2024/05/16 00:47

@class的使用

@class Dog ;

告诉编译器:Dog是一个类,并不会包含Dog这个类的所有内容

具体使用:在.h文件中使用@class引用一个类

.m文件中使用#import包含这个类

#import与@class的区别
1.import会包含这个类的所有信息,包括实体变量和方法,

@class只是告诉编译器,这是类的声明,具体类里有什么信息,不需要知道,等到实现时,才用到

2.@方式由于只需要被引用类名就可以了,而在实现引用类的实体变量和方法,在.m文件中导入#import来包含头文件

3.一旦导入的头文件修改了,引用到这个类的文件需要重新编译,用@class不会出现此类问题,有利于提高效率


循环retain 问题

解决方案:当两端互相引用时,应该一端用retain.一端用assign

NSString类的内存管理问题

NSString的写法:

NSString *str1 = @"a";

NSString *str2 = [NSString stringWithString:@"a"];

NSString *str3 = [NSString stringWithFormat:@"c"];

NSString *str4 = [[NSString alloc] initWithString:@"d"];

NSString *str5 = [[NSString alloc] initWithFormat:@"e"];

NSString *str6 = [[NSString alloc] init];

 str1 str2 str4 在常量区 str3 和str5 在堆区

 字符串的常量池:如果需要的字符串在常量池中已经存在,则系统不会给对象分配内存空间。autorelease的基本使用
自动释放池:是一种特殊的栈结构,对象可以加入到自动释放池中,自动释放池结束的时候,会给池中的对象发送一条release消息。

好处:不需要关心对象的释放时间

不需要关心什么时间调用release

加入自动释放池,格式:[对象  autorelease];
加入到自动释放池中以后,引用计数不会改变;
@autoreleasepool{自动释放池开始   }自动释放池结束;
当一个对象调用autorelease时,会将这个对象放到位于栈顶的释放池中。

[objc] view plaincopy
  1. #import <Foundation/Foundation.h>  
  2. #import "Student.h"  
  3. int main(int argc, const charchar * argv[]) {  
  4.     //1 创建自动释放池  
  5.     Student *stu = [Student new];  // stu  1  
  6.     @autoreleasepool {//自动释放池开始  
  7.         [stu run];  
  8.         NSLog(@"%lu",stu.retainCount); // 1  
  9.         // [stu autorelease] 把对stu加入到自动释放池中  
  10.         // 注意:加入到自动释放池中以后, 引用计数不会变化  
  11.         [stu autorelease];  //加入自动释放池,  
  12.         NSLog(@"%lu",stu.retainCount); // 1 
  13.         [stu run];  
  14.     }//自动释放池结束   [stu release];  
  15.     [stu run];  
  16.     return 0;  
  17. }  

使用注意:

1、并不是放到自动释放池代码中,都贵自动加入到自动释放池

没有调用autorelease 方法

在自动释放池外部发送autorelease方法

2、自动释放池可以嵌套

3、自动释放池中不宜放占用内存比较大的对象

ARC概念及原理

指针分类:

强指针:所有的指针都是强制指针 关键字strong

弱指针:__weak关键字修饰的指针__weak Person *p ; 

ARC  :自动引用计数

判断准则:

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

1、不允许调用对象的release方法

2、不允许调用autorelease 方法

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

ARC 下循环引用问题

解决方法:一端用strong   另一端用weak

ARC下的@property 参数

strong :用于OC对象,相当于MRC中的retain

weak : 用于OC对象,相当于MRC中的assign

assign:用于基本数据类型,跟MRC中的assign

copy:   一般用于NSString,跟MRC中的copy 一样 

ARC特点:

1、不允许调用release,retain,retainCount,

2、允许重写dealloc,但是不允许调用[super dealloc]
只要弱指针指向的对象不存在了,就直接把弱指针做  清空操作

ARC的兼容和转换

程序兼容ARC和非ARC部分。转化为非ARC  -fno-objco-arc 

转化为ARC     -f-objc-arc  


类别::

作用:再不修改原有的类的基础上增加新的方法

一个庞大的类可以分模块开发,多人来编写,有利于团队合作

目的:对现有类的扩展

作为子类的替代手段

对类中的方法归类

步骤:声明类别  实现类别   使用类别

注意:类别的命名规则:类名+扩展方法

声明:.h

@interface ClassName(CaregoryName)

NewMethod;

@end

注意:不允许在声明类别的时候定义变量

实现:.m

@implementation ClassName (CategoryName)

NewMothod{

......

}

@end

与一般成员方法调用形式相同,可以调用成员变量

注意事项:

只能增加方法,不能增加成员变量

可以访问原来类中的成员变量

如果分类和原类出现同名的方法,优先调用分类中的方法

[objc] view plaincopy
  1. @interface Student (study)  
  2. -(void)studyC;  
  3. -(void)studyIOS;  
  4. @end  
  5. @implementation Student (study)  
  6. -(void)studyC{  
  7.     NSLog(@"那人正在学习C语言!!");     
  8. }  
  9. -(void)studyIOS{  
  10.     NSLog(@"那人正在学习IOS!!");   
  11. }  
  12. @end  

分类非正式协议

就是给NSObject类或子类Foundation框架创建的类目

分类延展:

又称延展,是Category的一个特例,起名字为匿名(为空),并且添加的方法一定要予以实现

通过延展来实现方法的私有

可以访问实例变量

可以添加成员变量

在.m中填写的方法不能被子类继承

0 0
原创粉丝点击