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

——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 
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 
@interface Person : NSObject
-(void)run;
@end
@implementation Person
-(void)run{
    NSLog(@"person run");  
}
@end
int 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 
@class Dog;
@interface Person : NSObject
@property (nonatomic,weak) Dog *dog;
@end
@implementation Person
@end

@interface Dog : NSObject
@end
@implementation Dog
@end

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        Person *p = [Person new];
       //指向d的是一个弱指针
        p.dog = d;
        //d马上释放,无强指针指向
        d=nil
    }
    return 0;
}

4、ARC下循环应用问题

#import 
@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
@end

int 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

你可能感兴趣的:(ios开发)