------、期待与您交流! -------
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>
ARC 下的 @property 参数
- <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>
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 中直接去实现。
------、期待与您交流! -------来源: http://lib.csdn.net/article/ios/42754