day10: 内存管理高级:属性的内部实现原理、dealloc内释放实例变量、便利构造器方法的实现原理、collection的内存管理

本文详细解析了属性的内部实现原理,包括assign、retain、copy三种方式,并阐述了对象实例的dealloc方法用于释放资源。同时介绍了多态的概念及其在Objective-C中的应用,以及如何通过便利构造器实现资源的自动管理。此外,文章还讨论了集合类的内存管理机制,解释了如何通过集合类来管理对象的生命周期。

    一、属性的内部实现原理
        assign:基本数据类型、delegate(但是所有类型都可以使用assign,只不过有些使用assign可能会出现问题)
        retain:所有的对象类型,(基本数据类型不可以使用retain)
        copy:
 
    二、dealloc内释放实例变量
        用来释放自己的实例变量
 
    三、便利构造器方法的实现原理
        return [p autorelease];
 
    四、collection的内存管理
        collection就是NSArray NSDictionary NSSet ... 等容器类
        collection会自主管理自己内部的元素。
        collection内存的自主管理:
            加入collection中的对象会被retain
            移除collection的对象会被release
            collection被释放会对内部所有对象release
 
    五、多态
        多态 :父类指针指向子类对象(1、可以作为参数,2、可以作为返回值);
        OC中有个多态运行时系统;
        OC里的多态都是动态多态;
        多态可以让多个类共享相同的方法名,简化了接口,减轻了程序员负担;

        使用多态可以减少类型的判断,实现通用程序编程。

Person.h

#import <Foundation/Foundation.h>

@interface Person : NSObject

// assign:基本数据类型、delegate(但是所有类型都可以使用assign,只不过有些使用assign可能会出现问题)
@property(nonatomic,assign)NSInteger age;

// retain:所有的对象类型,(基本数据类型不可以使用retain)
@property(nonatomic,retain)NSString * name;

// copy:
@property (nonatomic,copy)NSString * sex;

// 初始化方法
-(instancetype)initWithName:(NSString *)name andAge:(NSInteger)age andSex:(NSString *)sex;

// 便利构造器
+(instancetype)personWithName:(NSString *)name andAge:(NSInteger)age andSex:(NSString *)sex;


@end

Person.m

#import "Person.h"

@implementation Person

@synthesize age = _age, name = _name, sex = _sex;

// 初始化方法 以后都这样写这个方法 以防内存的泄露
-(instancetype)initWithName:(NSString *)name andAge:(NSInteger)age andSex:(NSString *)sex{
    if (self = [super init]) {
        //切记:这里用setter方法
        self.name = name;
        self.age = age;
        self.sex = sex;
    }
    return self;
}

// 便利构造器 (便利构造器中使用autorelease自动释放)
+(instancetype)personWithName:(NSString *)name andAge:(NSInteger)age andSex:(NSString *)sex{
    Person * p = [[[Person alloc]initWithName:name andAge:age andSex:sex]autorelease];
    return p;
}

//assign getter setter 内部实现
-(void)setAge:(NSInteger)age{
    _age =  age;
}

-(NSInteger)age{
    return _age;
}

//retain:
//UI中会有一种设计模式,
-(void)setName:(NSString *)name{
    if (_name != name) {
        [name release];
        _name = [name retain];
    }
}

-(NSString *)name{
    return [[_name retain]autorelease];
}

// copy的setter和getter方法
-(void)setSex:(NSString *)sex{
    if (_sex != sex) {
        [sex release];
        _sex=[sex copy];
    }
}

-(NSString *)sex{
    return [[_sex copy]autorelease];
}


//dealloc作用,释放实例变量
-(void)dealloc{
    [_name release];
    [_sex release];
    //调用父类的dealloc写在最后
    [super dealloc];
}


@end

Teacher.h

#import "Person.h"

@interface Teacher : Person

@end

Teacher.m

#import "Teacher.h"

@implementation Teacher

@end

Student.h

#import "Person.h"

@interface Student : Person

@end

Student.m

#import "Student.h"

@implementation Student

@end

main.m

#import <Foundation/Foundation.h>
#import "Person.h"
#import "Student.h"
#import "Teacher.h"

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        // -----1.1--属性retain的内部实现原理-------
        // 创建Person对象
        Person * p1 = [[Person alloc]init];
        NSString * s1 = [[NSString alloc]initWithFormat:@"贝爷"];
        
        // 给p1的name赋值
        p1.name = s1;
        
        // 将s1释放,
        [s1 release];
        s1 = nil;
        
        // 创建一个string对象s2
        NSString * s2 = [[NSString alloc]initWithFormat:@"六娃"];
        
        // s2给p1的name再赋值
        p1.name = s2;
        
        // 释放s2
        [s2 release];
        s2 = nil;
        
        //
        p1.name = p1.name;
        
        //-----1.2--属性copy的内部实现原理-------
        
        //创建person对象
        Person *p2 = [[Person alloc]init];
        
        //创建字符串s3
        NSString * s3 = [[NSString alloc]initWithFormat:@"男"];
        
        //
        p2.sex = s3;
        
        //释放s1
        [s3 release];
        s3 = nil;
        
        //
        NSString * s4 = [[NSString alloc]initWithFormat:@"女"];
        //
        p2.sex = s4;
        //
        [s4 release];
        s4 = nil;
        
        //-----2--便利构造器方法的实现原理----------------
        NSString * name = [[NSString alloc]initWithFormat:@"贝爷"];
        NSString * sex = [[NSString alloc]initWithFormat:@"男"];
        //便利构造器创建的对象不需要释放,原因是便利构造器内部已经做过释放处理
        Person * p5 = [[Person alloc]initWithName:name andAge:18 andSex:sex];
        [name release];
        name = nil;
        [sex release];
        sex = nil;
        
        //-----3--多态----------------
        Person * stu1 = [[Student alloc]init];
//        NSObject * stu2 = [[Student alloc]init];
        
        stu1 = [[Teacher alloc]init];

    }
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值