您的位置:首页 > 大数据 > 人工智能

OC基础:内存(进阶):retain.copy.assign的实现原理

2015-06-26 17:36 267 查看
遍历构造器的内存管理

a.遍历构造器方法内部使用autorelease释放对象

b.通过遍历构造器生成的对象.不用释放.

内存的管理总结

1.想占用某个对象的时候,要让它的引用计数器+1(retain操作)

2.当不想再占用某个对象的时候,要让它的引用计数器-1(release操作)

3.谁alloc谁release,遍历构造器使用autorelease

另:当一个属性遵循了协议的时候(该属性就是代理),这时使用内存组的assign修饰.

多态:父类指针 指向 子类对象

没有继承就没有多态

父类可以指向子类对象,这个时候会有局限性,就是父类不能调用子类的特有的方法.

———————具体的retain copy assign的内部实现———————

Person.h

#import <Foundation/Foundation.h>

@interface Person : NSObject
@property (nonatomic,retain)NSString *name;
@property (nonatomic,assign)NSInteger age;
@property (nonatomic,copy)NSString *color;

-(id)initWithName:(NSString *)name
andAge:(NSInteger)age
andColor:(NSString *)color;
+(id)personWithName:(NSString *)name
andAge:(NSInteger)age
andColor:(NSString *)color;

@end


Person.m

#import "Person.h"

@implementation Person
@synthesize name=_name,age=_age,color=_color;

//retian
-(void)setName:(NSString *)name{
if (_name!=name) {
[_name release];
_name=[name retain];
}
}
-(NSString *)name{
return _name;
}

//assign
-(void)setAge:(NSInteger)age{
_age=age;
}
-(NSInteger)age{
return _age;
}

//copy
-(void)setColor:(NSString *)color{
if (_color!=color) {
[_color release];
_color=[color retain];
}
}
-(NSString *)color{
return _color;
}

-(id)initWithName:(NSString *)name
andAge:(NSInteger)age
andColor:(NSString *)color{
self=[super init];
if (self) {
_name=name;
_age=age;
_color=color;
}
return self;
}
+(id)personWithName:(NSString *)name
andAge:(NSInteger)age
andColor:(NSString *)color{
return [[Person alloc]initWithName:name andAge:age andColor:color];
}

-(void)dealloc{
[_name release];
[_color release];

[super dealloc];

}

@end
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: