博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
内存管理2-set方法的内存管理
阅读量:5157 次
发布时间:2019-06-13

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

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];    //再持有新传进来的对象。

}

}

转载于:https://www.cnblogs.com/yesihoang/p/4484340.html

你可能感兴趣的文章
设计模式-策略模式(Strategy)
查看>>
关于CALayer导致的crash问题
查看>>
sqoop导出数据|Hive|HDFS和脚本编写
查看>>
关于vue中watch和computed
查看>>
django orm 数据查询详解
查看>>
JarvisOJ Basic 熟悉的声音
查看>>
C# list导出Excel(二)
查看>>
CAS 单点登录模块学习
查看>>
跟着辛星用PHP的反射机制来实现插件
查看>>
Android应用开发-网络编程①
查看>>
input中的name,value以及label中的for
查看>>
静态库制作-混编(工程是oc为基础)
查看>>
jQuery 显示加载更多
查看>>
代理模式
查看>>
Confluence 6 系统运行信息中的 JVM 内存使用情况
查看>>
Confluence 6 升级以后
查看>>
用JS实现版面拖拽效果
查看>>
二丶CSS
查看>>
《avascript 高级程序设计(第三版)》 ---第二章 在HTML中使用Javascript
查看>>
Hibernate主键生成策略
查看>>