1.MRC
1.1淘汰的技术(为了理解自动的即ARC)
1.1引用计数(RC)是指alloc自动(在对象的堆空间)分配的一块儿存储空间,用于存储持有该空间的指针个数
1.2.1持有:一个指针指向对象后,并使该对象的RC值加1
1.2.2指向:仅仅存储对象的地址
1.3使用retainCount方法查看RC的值
1.4使用retain方法将RC值加1
1.5使用release方法将RC值减1后
1.5.1使用release方法将RC值减1后,RC不为0,release方法直接返回
1.5.2为0,则先调用dealloc方法,然后释放RC所在的对象的堆空间
1.6retain做property参数时,可以在setter方法中自动使属性持有所指向的对象,是RC加1。注意:一旦添加,必须在dealloc方法中释放属性

TRPoint.h
@interface TRPoint : NSObject
@property int x,y;
-(id)initWithX:(int)x andY:(int)y;
+(id)pointWithX:(int)x andY:(int)y;
-(NSString *)description;
@end
TRPoint.m
@implementation TRPoint
-(id)initWithX:(int)x andY:(int)y
{
self = [super init];
if(self)
{
self.x = x;
self.y = y;
}
return self;
}
+(id)pointWithX:(int)x andY:(int)y
{
TRPoint *p = [[TRPoint alloc]initWithX:x andY:y];
return p;
}
-(NSString *)description
{
return [NSString stringWithFormat:@"(%d,%d)",self.x,self.y];
}
-(void)dealloc
{
NSLog(@"点(%d,%d)被释放了",self.x,self.y);
[super dealloc];//ARC不用写这句
}
@end
TRCircle.h
#import <Foundation/Foundation.h>
#import "TRPoint.h"
NS_ASSUME_NONNULL_BEGIN
@interface TRCircle : NSObject
@property(retain,nonatomic) TRPoint*center;
@property(nonatomic) double radius;
@end
TRCircle.m
@implementation TRCircle
-(void)dealloc
{
[self.center release];
[super dealloc];
}
@end
ViewController.m
property (weak, nonatomic) IBOutlet UILabel *outputLabel;
-(void)printRC:(id)obj;
-(void)method1;
-(void)method2;
-(void)method3;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
[self method3];
}
-(void)printRC:(id)obj
{
self.outputLabel.text = [NSString stringWithFormat:@"%lu",[obj retainCount]];
}
-(void)method1
{
TRPoint *p = [[TRPoint alloc] initWithX:10 andY:20];
[self printRC:p];
[p release];
NSLog(@"-----------");
}
-(void)method2
{
TRPoint *p1 = [[TRPoint alloc] initWithX:10 andY:20];
[self printRC:p1];
TRPoint *p2 =p1;
[self printRC:p1];
[p2 retain];//将p2指向的空间持有,持有是指将其指向的空间的RC值加1
[self printRC:p1];
[p2 release];//将p2持有(对象堆)空间的RC值减1
[self printRC:p1];
[p1 release];
}
-(void)method3
{
TRPoint *p = [[TRPoint alloc] initWithX:10 andY:20];
TRCircle *c = [[TRCircle alloc] init];
c.center = p;
//[c.center retain];//在property的参数中添加retain,可以自动实现此句的功能
[p release];
//[c.center release];//此句被放在TRCoircle类的的dealloc方法中
[c release];
}
@end
2自动释放池
2.1在ARC中是已经过时技术
2.2是一个集合,其中有许多对象
2.3当自动释放池的作用域结束时,池中的所有对象,会被一次性释放
2.4工厂方法生成的对象,一般会被放入自动释放池
implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
@autoreleasepool
{
{
//TRPoint *p = [[[TRPoint alloc]initWithX:10 andY:20] autorelease];//MRC的方法
__autoreleasing TRPoint *p = [[TRPoint alloc]initWithX:10 andY:20];//ARC的方法
}
NSLog(@"---------");
}
}
@end
2.5自动释放池的嵌套
网友评论