分类和内存管理
一.分类的作用:在不改变原来类内容的基础上,可以为类增加一些方法
使用注意:
1)分类只能增加方法,不能增加成员变量
2)分类方法实现中可以访问原来类中声明的成员变量
3)同名方法,分类的优先级最高(方法重构,覆盖原类中方法)
4)方法调用优先级:分类—>原类—>父类(后编译的会覆盖先编译的(.h文件不编译))
二.SEL:
1)把方法包装成SEL类型的数据
2)根据SEL数据找到对应的方法地址
3)根据方法地址调用对应的方法
4)每个方法都有一个与之对应的SEL类型的对象
例:[p performSelect:@selector(test:) withObject:@“@123”];
[p test3:@“123”];
SEL类型创建:
SEL s = @selector(test3:);
NSString *name = @“test2”;
SEL s = NSSelectorFromString(name);
[p performSelector:s];
每个方法中都有一个SEL类型的_cmd变量,代表当前方法。
NSString *str = NSStrigFromSlelector(_cmd); //打印方法名
其实消息就是SEL
三.内存管理
1)内存管理的范围:任何继承了NSObject的对象,对其他基本数据类型(int,char,。。。)无效
2)变量内存:代码块结束时,(栈空间)局部变量销毁(c语言自动回收(检测作用域)),(堆空间动态分配)但对象不回消失,需要手动释放(发送消息)
3)引用计数器:每个对象都有自己的引用计数器,是一个整数,表示“对象被引用打次数”,即有多少人正在使用这个oc对象(用4个字节来存储引用计数器的值)
4)引用计数器操作:
给对象发送retain消息,计数器+1(热态呢方法返回对象本身)
给对象发送release消息,计数器-1
可以给对象发送retainCount消息获得当前的引用计数器值
5)对象的销毁:
一般会重写dealloc方法来释放相关资源
dealloc就像对象的遗言(当一个对象被回收时调用)(一定调用[super dealloc],放在最后面)
6)野指针:指向僵尸对象(所调用内存已经被回收到对象,僵尸对象不能再使用)的指针(指向不可用内存)如果继续访问内存会出现坏访问错误:EXC_BAD_ACCESS(对象死不能复生)
7)@property生成的set方法是直接赋值,没有管内存,@property (retain) Book *book 自动向set方法添加retain
8)set方法内存管理相关参数
1.*retain:release旧值,retain新值(适用于OC对象类型)
*assign:直接赋值(默认,适用于非OC对象类型)
*copy:release旧值,copy新值
2.是否生成set方法
*readwrite:同时生产setter和getter的申明,实现
*readonly:只会生成getter的声明,实现
@property (readwrite, assign) int heightj;
3.oc对象类型:
@property(nonatomic, retain) 类名,属性名
4.非oc对象类型:
@property(nonatomic, assign)类型名,属性名;
9)多线程管理
*nonatomic:性能高
*atomic:性能低(默认)
10)setter和getter方法的名称
*setter:决定了set方法的名称,一定要有个冒号:
*getter:决定了get方法的名称(一般用在BOOL类型get方法)
11)当两个类需要互相包含时,不能用在.h中用#import,需要双方都使用@class 类名(告诉编译器这是一个类),可以在.m文件中使用#import来包含接口
12)当出现两端循环引用解决方案时一端用retain,一端用assign
13)自动释放池:(延迟了对象的释放时间)
调用autorelease方法后,对象的计数器不变
autorelease方法返回对象本身,将对象放到一个自动释放池(创建多层池子之后,按栈方式存储)中,当自动释放池被销毁时,会对池子里面的所有对象做一次release操作,创建方式有大括号方式和
1.不用在关心对象的释放时间
2.不用再关心什么时候调用release
3.占用内存较大的对象不要随便使用autorelease
注意:release和autorelease只能使用其中一个,不能多次使用 autorelease
有时使用类方法快速返回一个autorelease对象,创建对象时不要直接使用类名,一般使用self
+(id)person{
return [[[self alloc] init] autorelease];
}
系统自带的方法里面没有包含alloc,new,copy,说明返回的对象都是autorelease的
14)ARC的判断准则:只要没有强指针指向对象,就会释放对象
指针分两种:
强指针:默认情况下,所有的指针都是强指针
弱指针:__weak
特点:
1.不允许调用release,retain,retainCount
2.允许重写dealloc,但不允许调用[supper dealloc]
3.@property的参数
*strong:成员变量是强指针(适用于OC对象类型)
*weak:成员变量是弱指针(适用于OC对象类型)
*assign:适用于非OC对象类型ying
如果出现循环引用则一个用__weak另一个用 __strong
4.以前的retain 改为用strong
如果文件以前不支持ARC,需要临时支持ARC,需要更改Compile Sources中的文件操作:
-f-objc-arc 支持ARC
-fno-objc-arc 不支持ARC
15)协议
协议只用来申明方法
@protorcol MyProtocol
-(void)test;
-(void)test;
16)block
1)用来保存一段代码
2)block的标志:^
例子:
int sum(int a, int b){
return a+b;
}
int (*p)(int, int) = sum;
int (^sumblock)(int, int) = ^(int a, int b){
return a+b;
};
int c = sumblock(10, 11);