------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------
ARC的概念及原理
ARC ( automatic reference counting ) 自动引用计数器。
指针的分类: 1)强指针 关键字 strong
2) 弱指针 关键字 weak
__strong Person *p = [Person new ]; 这就是一个强指针, 在创建对象时,默认为都是强指针。
ARC判断准则: 只要没有强指针指向对象,对象就会被释放。
<span style="font-size:12px;">int main(int argc, const char * argv[]) {
@autoreleasepool {
//在ARC下对象释放的判断依据: 对象没有强指针指向
//对象会立即释放内存空间
Car *car1 = [Car new];
//定义另外一个强指针指向
//__strong 修饰符,修饰这个指针是一个强指针,也可以不写
//__weak 修饰的这个指针是若指针
__weak Car *car2 = car1;
NSLog(@"car1 = %@,car2 = %@",car1,car2);
//car1的指向发生改变,对于Car对象来说没有强指针指向了,所以要释放对象
car1 = nil; //
// 1) car1 是强指针,重新指向其他内容了,对于对象来说没有强指针了
// 2) 弱指针 赋值为nil
NSLog(@"car1 = %@,car2 = %@",car1,car2);
[car2 run]; //[nil run];
[car1 run]; //[nil run];
NSLog(@"xxxxxx");
}
return 0;
}</span>
ARC机制的原理: 编译器自动在代码合适的地方插入 retain release autorelease
ARC机制的特点: 1)判断是否是ARC
查看项目信息 ;不能使用 retain release autorelease
在重写dealloc方法中,不能使用[super dealloc] ;
2)正常创建对象,不用手动释放对象
<span style="font-size:12px;">#import <Foundation/Foundation.h>
#import "Dog.h"
int main(int argc, const char * argv[]) {
@autoreleasepool {
//ARC机制下对象的释放
Dog *dog = [Dog new];
[dog run];
}
return 0;
}</span>
<span style="font-size:12px;">#import "Dog.h"
@implementation Dog
-(void)run{
NSLog(@"跑了");
}
- (void)dealloc
{
NSLog(@"Dog dealloc");
// [super dealloc];//可以重写dealloc方法,不能使用[super dealloc]
}
@end
</span>
ARC下的@property 参数
strong : 用于OC对象,相当于MRC中的 retain
<span style="font-size:12px;"><span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">weak : 用于OC对象,相当于MRC中的 assign</span></span>
assign : 基本数据类型
copy :一般与用于 NSString
@property (nonatomic,strong) Dog *dog
Category 的概念和作用
Category 是OC中特有的语法,一般称为分类\类目\
Category 的作用:
1)在不修改原有类的基础上增加新的方法
2)一个庞大的类可以分模块开发
3)一个庞大的类可以由多个人来开发,有利于团队开发。
分类的使用步骤
先声明,然后在实现
<span style="font-size:12px;">#import <Foundation/Foundation.h>
@interface Person : NSObject
@end
//声明类别
@interface Person (base)
-(void)run;
-(void)eat;
@end</span>
<span style="font-size:12px;">#import "Person.h"
@implementation Person
@end
//实现分类
@implementation Person (base)
-(void)run{
NSLog(@"人会跑");
}
-(void)eat{
NSLog(@"人会吃");
}
@end</span>
也可以通过图形界面生成Category
分类的使用注意事项:
1)在分类的声明中不能声明实例变量
2)不能使用set\get方法 @property
3)分类可以访问原来类中的成员变量
4)如果分类和原来类出现同名的方法,优先调用分类中的方法,原来类中的方法会被忽略。
分类(Category)非正式协议
非正式协议就是给NSObject类创建的分类又叫做非正式协议,非正式协议一般不需要进行实现,一般在子类中进行方法重写。
应用:
<span style="font-size:12px;">#import "NSObject+countNum.h"
@implementation NSObject (countNum)
-(void)countNum{
//先定义一个字符串
NSString *str = @"agsh67jh898hhjkhkhk2jhj68jl";
int count;
//循环控制
for (int i = 0; i<str.length; i++) {
//取出每一个字符
unichar ch = [str characterAtIndex:i];
if (ch >='0' && ch <='9') {
//判断是否是阿拉伯数字
//如果是则计数器+1
count ++;
}
}
//输出结果
NSLog(@"%@中有%d个数字",str,count);
}
@end</span>
延展的概念
延展称为扩展(Extendsion)是Category 的一个特例。
其名字为空,并且添加的方法一定要实现
@interface class (){
int age;// 可以在延展中定义实例变量
}
-(void) test; //这是一个相对私有的方法 //不能使用@impementation class () 中实现类别的方法。
@end
这里需要在 .m中直接去实现。