OC基础:内存(进阶):retain.copy.assign的实现原理 分类: ios学习 OC 2015-06-26 17:36 58人阅读 评论(0) 收藏

遍历构造器的内存管理
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

版权声明:本文为博主原创文章,未经博主允许不得转载。

原文地址:https://www.cnblogs.com/shaoting/p/4619812.html