分类和内存管理

一.分类的作用:在不改变原来类内容的基础上,可以为类增加一些方法

 

使用注意:

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);

 

posted @ 2015-07-24 19:37  do+better  阅读(189)  评论(0编辑  收藏  举报