ARC下属性对象实例对象内存释放时机
在ARC的机制里,内存是由系统释放,ARC的一个基本规则即使,只要某个对象被任一strong指针指向,那么它将不会被销毁。如果对象没有被任何strong指针指向,那么就将被销毁。在默认情况下,所有的实例变量和局部变量都是strong类型的。可以说strong类型的指针在行为上和MRC时代retain的property是比较相似的,系统会在我们当前方法调用结束后销毁对象在方法中生产的强引用指针,其中列举一下几种情况:
代码:
测试对象重新dealloc方法
#import "ReleaseObjectTest.h"
@implementation ReleaseObjectTest
- (void)dealloc
{
NSLog(@"%s---我释放了",__func__);
}
@end
在controller中有定义了测试对象的实例变量(默认Strong),weak类型属性,Strong类型属性和直接使用局部变量(默认Strong)
</pre></p><p><pre name="code" class="objc">@interface ViewController ()<UITableViewDataSource,UITableViewDelegate>
{
ReleaseObjectTest *releaseOb;
}
@property (weak,nonatomic)ReleaseObjectTest *weakReleaseOb;;
@property (strong,nonatomic)ReleaseObjectTest *strongReleaseOb;
@property (strong, nonatomic) IBOutlet UITableView *tableView;
@end
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
//1.局部变量,会在viewDidLoad结束后调用ReleaseObjectTest的dealloc方法,对象释放
ReleaseObjectTest *releaseOb = [ReleaseObjectTest new];
//2.实例变量,在viewDidLoad结束后不会调用ReleaseObjectTest的dealloc方法,(页面释放后他才被释放)
releaseOb = [ReleaseObjectTest new];
//3.Strong属性,会在viewDidLoad结束后调用ReleaseObjectTest的dealloc方法,对象释放
self.strongReleaseOb = [[ReleaseObjectTest alloc] init];
//4.weak属性,会在viewDidLoad结束后调用ReleaseObjectTest的dealloc方法,对象释放(属性对象一般不用weak修饰(IBOutlet除外,因为它的对象不在方法中生产,指针被他父视图view持有,释放机制跟父视图有关(具体此处不做解释)),测试需要)
self.weakReleaseOb = [[ReleaseObjectTest alloc] init];
/*
*arc 下释放机制总结
*1.实例变量,局部变量默认都是Strong强引用
*2.局部变量在方法中释放,默认生产强引用指针,但是在方法结束会指针被回收,该内存没有强引用指针,随之被释放
*3.实例变量,Strong属性会给对象加一个强引用指针,因此方法结束后对象还有Strong强引用指针,对象不会被释放,只有在页面销毁后指针销毁,随之对象释放
*4.weak属性,方法调用结束后对象只有weak若引用指针,会被释放
*/
}