博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
day10: 内存管理高级:属性的内部实现原理、dealloc内释放实例变量、便利构造器方法的实现原理、collection的内存管理
阅读量:4219 次
发布时间:2019-05-26

本文共 4144 字,大约阅读时间需要 13 分钟。

    一、属性的内部实现原理
        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 
@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 
#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;}

转载地址:http://voxmi.baihongyu.com/

你可能感兴趣的文章
python科学计算库(一)Matplotlib
查看>>
python科学计算库(二)Numpy
查看>>
python科学计算库(三)Pandas
查看>>
python科学计算库(四)Seaborn
查看>>
机器学习(一)K-近邻
查看>>
UML九种图
查看>>
RUP(Rational 统一开发过程)
查看>>
设计模式与UML
查看>>
培养好习惯
查看>>
bill老师培训(二)
查看>>
bill老师培训(一)
查看>>
编译原理-文法复习
查看>>
监考那时心情
查看>>
“批斗”大会
查看>>
信息资源管理
查看>>
信息资源管理
查看>>
BASIC-2 01字串 循环 显示32个二进制数
查看>>
ALGO-1 区间k大数查询 排序 查找
查看>>
ALGO-2 最大最小公倍数 贪心算法
查看>>
C#基础—面向对象
查看>>