黑马程序员—IOS基础之OC—ARC和Category

来源:互联网 发布:java接口防止重复调用 编辑:程序博客网 时间:2024/05/19 20:01

——Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ——

                    第一章 ARC

一、ARC概念及原理
在引入ARC内存管理之前我们先引入指针的概念
1、指针分类

 (1)强指针,如果不做任何说明OC中得指针默认为强指针,关键字strong。(2)弱指针,__weak关键字修饰的指针为弱指针。

2、概念及原理

(1)概念:ARC是自动内存管理方式,是Objictive编译器的一种特性,不是运行时特性或垃圾回收机制。(2)原理:只要对象没有强指针指向,对象就会释放内存空间。

二、ARC的使用
1、ARC的入门

(1)判断是否是ARC机制,对对象不做release出来,用dealloc方法查看项目信息,看是否释放。代码如下:
@implemention Person-(void)dealloc{NSLog(@"person dealloc");}@end#import <Foundation/Foundation.h>int main(int argc, const char * argv[]) {    @autoreleasepool {        Person *p =[Person new];        [p run];    }    //运行到这里会自动释放对象,会打印person dealloc    return 0;}

注意:dealloc方法中不能调用父类的方法即:[super dealloc]。

    (2)ARC的使用,正常创建对象,不用手动释放。

2、ARC下单对象内存管理
因为局部变量会在自动释放池的末尾销毁,那么此时对象一般就没了强指针指向,对象随之就会被销毁。

#import <Foundation/Foundation.h>@interface Person : NSObject-(void)run;@end@implementation Person-(void)run{    NSLog(@"person run");  }@endint main(int argc, const char * argv[]) {    @autoreleasepool {        Person *man =[Person new];        Person *women =man;        //虽然man指向nil,但内存不会释放,因为还有强指针women指向。验证了判断准则        man=nil;    }    return 0;}

内存释放的过程:先释放,若有弱指针指向,就给弱指针赋值为nil。

3、ARC下多对象内存管理
在ARC机制下不能使用retain作为@property的参数,应该使用strong和weak作为@priperty的参数。

#import <Foundation/Foundation.h>@class Dog;@interface Person : NSObject@property (nonatomic,weak) Dog *dog;@end@implementation Person@end@interface Dog : NSObject@end@implementation Dog@endint main(int argc, const char * argv[]) {    @autoreleasepool {        Person *p = [Person new];       //指向d的是一个弱指针        p.dog = d;        //d马上释放,无强指针指向        d=nil    }    return 0;}

4、ARC下循环应用问题

#import <Foundation/Foundation.h>@class Dog;@interface Person : NSObject@property (nonatomic,strong) Dog *dog;@end@implementation Person@end@interface Dog : NSObject@property (nonatomic,strong) Person *owener;@end@implementation Dog@endint main(int argc, const char * argv[]) {    @autoreleasepool {        Person *p = [Person new];        Dog *d = [Dog new];        d.owener=p;        p.dog = d;    }    //程序运行到括号完时,不会退出,因为局部变量p,d虽然销毁,不再指向对象,但是Person和Dog互相指向,所以不会释放    //循环引用若有一个指针指向,对象都会释放,若两个都是强指针都无法释放。    //解决办法:一端使用weak,一段使用strong    return 0;}

5、ARC下set方法内存管理@property参数

(1)原子性和读写的参数都和MRC下是一样的。(2)ARC下没有了retain方法,取而代之的是strong和weak。

6、ARC使用特点及注意事项

 特点 (1)不允许release、retain和retain count的使用。(2)允许dealloc,不允许[super dealloc](3)@preperty参数的变化注意(1)ARC中弱指针指向的对象不存在了,弱指针为nil。(2)__weak Person *p=[Person new];是不允许这样写的,对象刚创建,由于指向的是弱指针,创建的瞬间就被释放了,不正确。

`

                第二章  Category

一、分类的概念和使用流程

1、分类的概念

category称为分类、类别或者类目。category是OC特有的语法。作用:在不修改原有类的基础上增加新方法,使得一个庞大的类可以分模块开发,可以由多个人来编写,更利于团队合作目的:(1)对现有类进行扩展(2)作为子类的替代手段(3)不需要定义和使用一个类(4)对类中得方法归类

2、使用分类的实现步骤

分类的实现分为三步:分类的声明、分类的实现和分类的使用分类的声明:类名+(扩展方法)分类的实现:待扩展类+(分类的名称)分类的实现:和使用类中原有的对象一样
//声明@interface Person(base)-(void)run;@end//实现@implementation Person(base)-(void)run{NSLog(@"base run");}@end//使用Person *p = [Person new];[p run];

3、分类使用注意事项

(1)分类只能增加方法,不能增加成员变量(2)分类可以访问原来类的成员变量(3)分类和原类出现同名的方法,优先调用分类的方法,原来类的方法被忽略。(4)也不能用@property定义新方法,@preperty int age;错误的。(5)当出现多个分类方法同名时?执行的时最后编译的类别,编译的顺序可以改变。

4、分类非正式协议

NSObject或其子类Foundation框架中的类增加新的类别   称为非正式协议。NSString+countnum//非正式协议Gun+shot普通类别
//声明@interface NSString(countnum)-(void)countnum;@end//实现@implementation Person(base)-(void)countnum{int count = 0;for(int i=0;i<self.length;i++){unichar ch = [str characteAtIndex:i];if(ch>'0'&&ch<'9'){count++;}}}@end//使用NSString *str=@"sadn239d";[str countnum];

5、分类的延展

类的延展的概念:类的延展是分类的一个特例,它就是分类声明中,分类名为空的情况。特点(1)可以在延展中定义实例变量(2)不能够用@implementation 类名写(3)可以用@property定义私有的变量和方法
@interface Person(){//定义实例变量float _height;}-(void)run;//@property的使用@property int age;@end@interface Person:NSObject@end@implementation Person//不允许()//方法在这里实现-(void)run{NSLog(@"Person run");}@end
0 0