黑马程序员技术交流社区
标题:
二战黑马:ARC_strong、weak
[打印本页]
作者:
崔石炫
时间:
2014-10-23 23:55
标题:
二战黑马:ARC_strong、weak
// Person.h
#import <Foundation/Foundation.h>
@class Card;
@interface Person : NSObject
@property(nonatomic , strong) Card *card;
+ (id)person;
@end
// Person.m
#import "Person.h"
#import "Card.h"
@implementation Person
+ (id)person // 便利构造器
{
return [[self alloc] init]; //使用self的好处:方便子类调用父类的快速构造器,返回子类对象
//return [[Person alloc] init]; //这样写的话,就写死了,子类调用此构造器返回的是父类对象,违背多态的思想
}
- (void)dealloc
{
NSLog(@"人对象被回收");
}
@end
复制代码
// Card.h
#import <Foundation/Foundation.h>
@class Person;
@interface Card : NSObject
@property(nonatomic , weak) Person *owner;
+ (id)card;
@end
// Card.m
#import "Card.h"
#import "Person.h"
@implementation Card
+ (id)card
{
return [[self alloc] init]; //写self而不是Card,利于多态
}
- (void)dealloc
{
NSLog(@"身份证对象被回收");
}
@end
复制代码
// Student.h
#import "Person.h"
@interface Student : Person
@end
// Student.m
#import "Student.h"
@implementation Student
- (void)dealloc
{
NSLog(@"学生对象被回收");
}
@end
复制代码
// main.m
#import <Foundation/Foundation.h>
#import "Person.h"
#import "Student.h"
#import "Card.h"
/*
ARC机制的原理:只要没有强指针指向对象,系统自动回收对象所占内存
ARC注意点:
* 循环引用:一端用strong,另一端用weak
* 重写dealloc方法:不能调用super的dealloc方法
* 禁用retainCount、retain、release、autorelease等与内存管理相关的方法
*/
int main(int argc, const char * argv[])
{
@autoreleasepool {
Student *s = [Student person]; //调用父类的快速构造器
Card *c = [Card card];
//NSLog(@"%ld" , [s retainCount]); //ARC禁用retainCount、retain、release、autorelease等与内存管理相关的方法
s.card = c;
c.owner = s;
__strong Card *c2 = [Card card];
c2 = nil; //强指针置为空指针,Card对象立马被回收
}
return 0;
}
复制代码
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2