• 内存管理2-set方法的内存管理


    1.对象之间的内存管理:

    每个学生都有一本书

    book类 @price

    学生类  @age

              @book

    --------------------

    #import "book.h"

    @interface Student:NSObject

    @property int age

    @property BOOK *book;//OC类名与*离不开

    @end

    -------------

    Student.m文件

    #import "Student.h"

    @implementation Student

    - (id)initWithAge:(int)age{

    if(self=[super init]){

    _age=age;

    }

    return self;

    }

    -(void)dealloc{

    NSLog(@"student:%i 被销毁了",_age);

    [super dealloc];

    }

    @end

    --------------------------

     

    command+B->编译

    注释方法:

    1 #pragma  mark 注释

    可以快速定位到注释那里。

    2私有方法,直接在.m文件中实现不用.h中声明

    方法分类:生命周期,私有方法,公共方法

    #pragma mark - 生命周期方法(组名) 然后会分层

    #pragma mark 单独给一个方法注释

     -------------------------------------------------

    如果自己手动实现了getter和setter,Xcode就不会自动生成@synthesize,也就不会自动生成_book。

    ----------------------------------------------------

    谁创建谁释放,谁调用谁返回。

    retain 到另一个NSString之后,地址相同(建立一个指针,指针拷贝),内容当然相同,这个对象的retain值+1,也就是说,retain是指针拷贝,copy是内容拷贝。在拷贝之前,都会释放旧的对象。

    assign:简单赋值,不更改索引计数(Reference Counting)。

    copy:建立一个索引计数为1的对象,然后释放旧对象

    retain:释放旧的对象,将旧对象的值赋予输入对象,再提高输入对象的输入对象的索引计数为1

    使用assign:对基础数据类型(NSInteger)和C数据类型(int ,float,double,char等)

    使用copy:对NSString

    使用retain:对其他NSObject和其子类。

    ------------------------------------------------------

     所以讲了半天就是有一个Student想要一本Book

    所以就调用book对象,在Student内部

    -(void)setBook:(Book *)book{

    _book=[book retain];

    }

    来retain book

    在释放student的

    -(void)dealloc{

    [_book realease];          //[self.book release]一样的

    }

    释放Book对象。

    --------------------------------------------------

    因为student计数器变为0 所以调用的alloc 方法,所以会调用[book release]

    ------------------------------------------------------

    当有两本书的时候就会发生第一本书的内存泄露,所以代码改为

    -(void)setBook:(Book *)book{

    [_book release];            //释放之前的book。

    _book=[bool retain];    //再持有新传进来的对象。

    }

    oc没有空指针错误,所以没有前面一本book就没关系。

    -----------------------------------------------------

    利用一个空指针去调用和利用野指针调用有什么区别?

    野:指向已经被释放内存的指针(你不该访问的内存)

    空:没有指向任何对象的指针

    1.野指针会报错,空指针不会报错

    野指针还是存在指针的(因为还在存储地址,但是那块内不对了)

    stu=nil; //就好了,清空指针。

    ----------------------------------------------------------------

    总结

    1 基本数据类型自动释放

    2最终结果

    -(void)setBook:(Book *)book{

    if(_book!=book){      //传进来的book不是当前的book才进行release

    [_book release];            //释放之前的book。

    _book=[bool retain];    //再持有新传进来的对象。

    }

    }

  • 相关阅读:
    VSCode搭建golang环境
    Jmeter之连接数据库
    Jmeter之『如果(If)控制器』
    mysql时间SQL
    正则表达式查找“不包含XXX字符串”
    Jmeter5.3源码编译
    Log4j源码分析
    12 个 JS 技巧
    高效学习很重要
    IntelliJ IDEA自动导入包去除星号(import xxx.*)
  • 原文地址:https://www.cnblogs.com/yesihoang/p/4484340.html
Copyright © 2020-2023  润新知