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

}

}

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值