——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