一,循环retain问题:
1,什么是循环retain?
两个类之间互相包含;
例如:Dog中retain了一个Person,Person中retain了一个Dog;
@interface Dog : NSObject
@property (nonatomic,retain) Person *owner;
@end
@interface Person : NSObject
@property (nonatomic,retain) Dog *dog;
@end
Person *p = [Person new];
Dog *d = [Dog new];
p.dog = d;
d.owner = p;
2,如何解决循环retain?
在两端的set方法中,有一端必须使用assign直接赋值,不能用retain;在@property中参数使用assign。
例如:
@interface Dog : NSObject
@property (nonatomic,assign) Person *owner;
@end
@interface Person : NSObject
@property (nonatomic,retain) Dog *dog;
@end
二,NSString内存管理:
stringWithFormat(不需要release)
initWithFormat(需要release) 这两种方式创建的字符串对象是在内存的堆区里面;
stringWithString(不需要release)
initWithString(不需要release) 这两种方式创建的字符串对象在内存的常量区里面;
NSString *str1 = @"abc";(不需要release) //@"abc" 字符串的常量,存在在常量区
三,自动释放池autorelease的介绍:
1,自动释放池是程序在运行期间,创建的一些管理对象的池子.这些池子是一种特殊的栈结构.
2,自动释放池,是如何管理对象内存的?
在自动释放池自身释放的时候,会对池子中的每个对象发送一次release消息;注意,对每个对象只发送一次release消息;
3,如何创建一个自动释放池?
@autoreleasepool {
}
4,如何将一个对象加入到池子中?
在池子的代码块中,调用对象的autorelease方法;就可以将这个对象加入到这个池子中.
例如:
Person *p = [Person new];
@autoreleasepool {
[p autorelease]; //加入自动释放池,
}
5,autorelease的使用注意:
1),必须在自动释放池的代码块中调用autorelease方法,对象才会加入池子中;
2),尽量避免对大内存使用该方法,因为这种是延迟释放机制;
3),不要把大量循环操作放到同一个 @autoreleasepool 之间,这样会造成内存峰值的上升;
4),不要对同一个对象连续调用多次autorelease方法;
5),autorelease和release只能使用一个;
//------------------------下午---------------------------
一,ARC的概念和原理:
1,指针分类:
(1)强指针:默认的情况下,所有的指针都是强指针,关键字strong;
(2)弱指针:_ _weak关键字修饰的指针;
2,什么是ARC:
Automatic Reference Counting,自动引用计数,即ARC;
ARC是新的LLVM 3.0编译器的一项特性;
8
3,ARC原理:
ARC是Objective-C编译器的特性,而不是运行时特性或者垃圾回收机制,ARC所做的只不过是在代码编译时为你自动在合适的位置插入release或autorelease,retain。
4,ARC判断准则:
(1),只要还有一个强指针变量指向对象,对象就会保存在内存中。
(2),只要没有强指针指向对象,对象就会被释放。
5,ARC下循环引用问题:
一端使用strong,一端使用week;
二,ARC下@property参数
ARC中的@property
strong: 用于OC对象, 相当于MRC中的retain;
weak: 用于OC对象,释放了之后,会将指针置为nil, 其他相当于MRC中的assign;
assign: 用于基本数据类型, 跟MRC中的assign一样;
copy: 一般用于NSString, 跟MRC中的copy一样;
三,ARC使用特点和注意事项:
1、ARC特点总结
(1)不允许调用release,retain,retainCount;
(2)允许重写dealloc,但是不允许调用[super dealloc];
(3)@property的参数:
strong: 相当于原来的retain(适用于OC对象类型),成员变量是强指针
weak: 相当于原来的assign,(适用于oc对象类型),成员变量是弱指针
assign: 适用于非OC对象类型(基础类型)
copy: 一般用于NSString, 跟MRC中的copy一样
2、ARC使用注意事项
1)ARC中,只要弱指针指向的对象不在了,就直接把弱指针做清空(赋值为nil)操作。
2)__weak Person *p=[[Person alloc] init];//不合理,对象一创建出来就被释放掉,对象释放掉后,ARC把指针设置为nil。
3)ARC中在property处不再使用retain,而是使用strong;
@property(nonatomic,strong)Dog *dog;
// 意味着生成的成员变量_dog是一个强指针,相当于以前的retain。
四,ARC和MRC之间互相转换:
1,将MRC工程转为ARC工程:
用XCode工具: Edit -> Convert -> To Objective-C ARC
2,ARC和MRC之间互转的指令:
ARC转变为MRC指令, -fno-objc-arc
MRC转变为ARC的指令, -fobjc-arc
|
|