• 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
    

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

  • 相关阅读:
    @RequestParam注解使用:Name for argument type [java.lang.String] not available, and parameter name information not found in class file either.
    cglib动态代理导致注解丢失问题及如何修改注解允许被继承
    springboot Autowired BeanNotOfRequiredTypeException
    git根据用户过滤提交记录
    不同包下,相同数据结构的两个类进行转换
    How to use Jackson to deserialise an array of objects
    jooq实践
    java如何寻找main函数对应的类
    Python--matplotlib
    Python 和 Scikit-Learn
  • 原文地址:https://www.cnblogs.com/shaoting/p/4619812.html
Copyright © 2020-2023  润新知