黑马程序员-[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时,会将这个对象放到位于栈顶的释放池中。
- #import <Foundation/Foundation.h>
- #import "Student.h"
- int main(int argc, const charchar * argv[]) {
- //1 创建自动释放池
- Student *stu = [Student new]; // stu 1
- @autoreleasepool {//自动释放池开始
- [stu run];
- NSLog(@"%lu",stu.retainCount); // 1
- // [stu autorelease] 把对stu加入到自动释放池中
- // 注意:加入到自动释放池中以后, 引用计数不会变化
- [stu autorelease]; //加入自动释放池,
- NSLog(@"%lu",stu.retainCount); // 1
- [stu run];
- }//自动释放池结束 [stu release];
- [stu run];
- return 0;
- }
使用注意:
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
与一般成员方法调用形式相同,可以调用成员变量
注意事项:
只能增加方法,不能增加成员变量
可以访问原来类中的成员变量
如果分类和原类出现同名的方法,优先调用分类中的方法
- @interface Student (study)
- -(void)studyC;
- -(void)studyIOS;
- @end
- @implementation Student (study)
- -(void)studyC{
- NSLog(@"那人正在学习C语言!!");
- }
- -(void)studyIOS{
- NSLog(@"那人正在学习IOS!!");
- }
- @end
分类非正式协议
就是给NSObject类或子类Foundation框架创建的类目
分类延展:
又称延展,是Category的一个特例,起名字为匿名(为空),并且添加的方法一定要予以实现
通过延展来实现方法的私有
可以访问实例变量
可以添加成员变量
在.m中填写的方法不能被子类继承
- 黑马程序员-[OC]学习之旅-ARC机制和类别
- 黑马程序员---成长之路-----OC之基础篇ARC和类别
- 黑马程序员-[OC语言] 第四篇:ARC机制、类别 概述
- 黑马程序员IOS基础---OC学习之ARC
- 黑马程序员-OC学习笔记-----ARC和代码块block
- 黑马程序员------OC ARC管理和Category
- 黑马程序员-[OC]学习之旅-对象和类
- 黑马程序员-[OC]学习之旅-NSString使用和方法
- 黑马程序员——OC语言的ARC机制
- 黑马程序员-------ARC机制
- 黑马程序员---OC学习笔记之ARC的概念及原理
- 黑马程序员—IOS基础之OC—ARC和Category
- 黑马程序员——OC学习之内存管理ARC
- 黑马程序员- IOS学习笔记-OC ARC、BLOCK、protocol
- 黑马程序员--OC内存管理机制(下)之ARC
- 黑马程序员——OC之ARC、Block、Protocol
- 黑马程序员——OC语言------内存管理和ARC
- 黑马程序员——OC语言学习——ARC机制、block代码块、protocol协议、protocol协议的应用
- 数据库常用高级用法(不定期更新)
- Ubuntu 安装keepalived
- UILable
- 解题报告 之 HDU5316 Magician
- hdu 5418 Victor and World(floyd+状压dp)
- 黑马程序员-[OC]学习之旅-ARC机制和类别
- ASP.NET MVC 4 插件化架构简单实现-思路篇
- jQeury入门:jQuery对象
- 每个Android开发者应该知道的6个SDK和API
- addChildViewController的用法
- Vim 编解器常用命令总结
- 常用的日文正文字体有哪些?
- iOS学习UI之UIButton
- 减脂日记-8-23