示例代码
Dog.h
#import <Foundation/Foundation.h>
@class Person;
@interface Dog : NSObject
@property (nonatomic, strong) Person *owner;
@end
Dog.m
#import "Dog.h"
@implementation Dog
- (void)dealloc{
NSLog(@"Dog dealloc...");
}
@end
Person.h
#import <Foundation/Foundation.h>
#import "Dog.h"
@interface Person : NSObject
@property (nonatomic, weak) Dog *dog;
@end
Person.m
#import "Person.h"
@implementation Person
- (void)dealloc{
NSLog(@"Person dealloc...");
}
@end
main.m
#import <Foundation/Foundation.h>
#import "Person.h"
#import "Dog.h"
int main(int argc, const char * argv[]) {
@autoreleasepool {
// insert code here...
Person *p = [Person new];
Dog *d = [Dog new];
p.dog = d;
d.owner = p;
//1. Person中Dog属性是weak时,内存管理自动完成。d=nil,则d释放;
//2. Person中Dog属性是strong时,Person释放后Dog才释放
// d = nil;
// p = nil;
NSLog(@"***");
//3 循环引用问题,即双方中属性都是strong时,则出现内存泄露,解决方法即一方是strong,一方是weak;
}
return 0;
}
总结
MRC ARC
assign assign
retain strong(强指针)OC其他的对象 weak(弱指针)UI控件
copy copy
ARC的使用细节:
不能调用release、retain、autorelease、retainCount
可以重写dealloc,但是不能调用[super dealloc]
ARC中的@property
➢ strong : 用于OC对象, 相当于MRC中的retain
➢ weak : 用于OC对象,相当于MRC中的assign,不同点是MRC中的assign在清空指针指向的对象后不会不会将原指针赋值为nil,而ARC中weak指针指向的对象被清空后会讲weak指针赋值为nil,避免野指针问题。
➢ assign : 用于基本数据类型, 跟MRC中的assign一样
➢ copy : 一般用于NSString, 跟MRC中的copy一样
➢ 在ARC情况下解决”循环retain”的问题:@property一边用strong,一边用weak。