------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------
1、指针分类
(1)强指针:默认的情况下,所有的指针都是强指针,关键字strong
(2)弱指针:__weak关键字修饰的指针
声明一个弱指针如下:__weak Person *p;
2、什么是ARC?
Automatic Reference Counting,自动引用计数,即ARC,在工程中使用ARC非常简单:只需要像往常那样编写代码,只不过永远不写retain,release和autorelease三个关键字就好,这是ARC的基本原则。当ARC开启时,编译器将自动在代码合适的地方插入retain,release和autorelease,而作为开发者,完全不需要担心编译器会做错。
ARC与其他语言的“垃圾回收”机制不同。ARC:编译器特性;“垃圾回收”:运行时特性。
3、ARC工作原理及判断准则
ARC是Objective-C编译器的特性,而不是运行时特性或者垃圾回收机制,ARC所做的只不过是在代码编译时为你自动在合适的位置插入release或autorelease,
只要没有强指针指向对象,对象就会被释放。
4、ARC机制
一个对象可以拥有不止一个的持有者(这个类似MRC中的retainCount>1的情况)。
ARC的一个基本规则即是,只要某个对象被任一strong指针指向,那么它将不会被销毁。如果对象没有被任何strong指针指向,那么就将被销毁。在默认情况下,所有的实例变量和局部变量都是strong类型的。可以说strong类型的指针在行为上和MRC时代retain的property是比较相似的。
在ARC机制作用下,所有指向这个对象的weak指针将被置为nil。使用ARC以后,不论是strong还是weak类型的指针,都不再会指向一个dealloce的对象,从根源上解决了意外释放导致的crash。
5、ARC机制判断
ARC机制下有几个明显的标志:
1)不允许调用对象的release等方法;
2)不允许调用autorelease方法;
3)再重写父类的dealloc方法时,不能再调用 [super dealloc]。
6、ARC工作原理及强弱指针
(1)、ARC工作原理详述
ARC是Objective-C编译器的特性,而不是运行时特性或者垃圾回收机制,ARC所做的只不过是在代码编译时为你自动在合适的位置插入release或autorelease;
ARC的判断准则:只要没有强指针指向对象,对象就会被释放。
(2)、强弱指针
所有的指针默认就是强指针,强指针用__strong标示,弱指针用__week标示
7、ARC下循环引用
1)、ARC下循环引用问题
#import <Foundation/Foundation.h>
@class Dog;
@interface Person : NSObject
//dog是strong 强指针
@property(nonatomic,strong) Dog*dog;
@end
@class Person;
@interface Dog : NSObject
//狗的主人也是strong 强指针
@property(nonatomic,strong) Person*owner;
@end
int main(int argc, const char * argv[]){
@autoreleasepool{
Person*p = [[Person alloc]init];
Dog *d = [[Dog alloc]init];
//当p.dog = d后,仍然能够正常释放
p.dog = d;
//当增加d.owner = p;时形成循环引用
d.owner = p;
}
return 0;
}
解决方案:
循环引入的对象中其中一个对象设置为strong 另一个设置为weak
2)、ARC下@property参数:
strong:用于OC对象, 相当于MRC中的retain
weak:用于OC对象, 相当于MRC中的assign
assign:用于基本数据类型, 跟MRC中的assign一样
copy:一般用于NSString, 跟MRC中的copy一样
在ARC情况下解决”循环retain”的问题:@property一边用strong,一边用weak。
8、ARC特点及注意事项
(1)、ARC特点总结
1)、不允许调用release,retain,retainCount;
2)、允许重写dealloc,但是不允许调用[superdealloc];
3)、@property的参数:
strong:相当于原来的retain(适用于OC对象类型),成员变量是强指针
weak:相当于原来的assign,(适用于OC对象类型),成员变量是弱指针
assign:适用于非OC对象类型(基础类型)
(2)、ARC使用注意事项
1)、ARC中,只要弱指针指向的对象不在了,就直接把弱指针做清空(赋值为nil)操作;
2)、__weakPerson*p=[[Person alloc] init];//不合理,对象一创建出来就被释放掉,对象释放掉后,ARC把指针设置为nil;
3)、ARC中在property处不再使用retain,而是使用strong,在dealloc中不需要再[super dealloc];
@property(nonatomic,strong)Dog*dog;
//意味着生成的成员变量_dog是一个强指针,相当于以前的retain。
4)、如果换成是弱指针,则换成weak,不需要加__。
本文详细介绍了Objective-C中的自动引用计数(ARC),包括强指针和弱指针的概念,ARC的工作原理、判断准则和机制,以及在循环引用、内存管理上的特点和注意事项。ARC通过编译器自动插入release和autorelease,简化了内存管理,但开发者仍需要注意避免循环引用等问题。
3329

被折叠的 条评论
为什么被折叠?



