多对象的内存管理

                                                     多对象的内存管理

     


        多对象的内存管理。 在OC 中对内存我们都会引用计数器 ,创建或者调用对象,用retain方法是计数器+1,释放内存用release 方法 ,当计数器的个数为0时,就不再调用对象。

  retain 和release方法

  1> retain 计数器+1,会返回对象本身

  2> release: 计数器-1 没有返回值

  3> retainCount 获取当前的计数器

  4> dealloc  

    *  当一个对象要被回收的时候,就会调用

    *   一定要调用[super dealloc],这句话要放在最后面 

  

 Book 对象的声明文件



#import <Foundation/Foundation.h>

@interface Book : NSObject
{
    int _price;
}
- (void)setPrice: (int)price;
- (int) Price;
@end

Book对象的实现文件

#import "Book.h"

@implementation Book
- (void)setPrice:(int)price
{
    _price = price;
}
 - (int)Price
{
    return _price;
}

- (void) dealloc
{
    NSLog(@"Book对象被释放");
    [super dealloc];
}
@end

Person 对象的声明文件

 

#import <Foundation/Foundation.h>
#import "Book.h"
@interface Person : NSObject
{
    Book*_book;
}
- (void)setBook:(Book*)book;
- (Book*)book;

@end

 Person 对象的实现文件

#import "Person.h"

@implementation Person

- (void)setBook:(Book *)book
{
    _book =[Book retain];
}

 - (Book*)book
{
    return _book;
}
- (void)dealloc
{
    [_book release];
    NSLog(@"person对象被释放");
    [super dealloc];
}
@end

 主函数

 

#import <Foundation/Foundation.h>
#import "Person.h"
#import "Book.h"
int main(int argc, const char * argv[]) {
    
    Book*b = [[Book alloc] init];
    
    Person* p1 = [[Person alloc] init];
    
    [p1 setBook:b];
    
    [b release];
    
    b = nil;
    
    [p1 release];
    
    p1= nil;
    
    return 0;
}
  运行结果:

 Book对象被释放,

Person 对象被释放。

代码并不是最重要的,理解内存管理的原理是最关键的。

   在主函数中

Book*b = [[Book alloc] init];
b->1 b对象的计数器个数+1
同理
   Person* p1 = [[Person alloc] init];
p1-> 1 p1对象的计数器个数+1

</pre><pre name="code" class="objc"> [p1 setBook:b];
</pre><pre name="code" class="objc">p1对象调用了setBook方法后 ,b->2 ,b对象的计数器个数为2 
</pre><pre name="code" class="objc">[b release];  b释放内存,并没有完全释放掉,b->1 
<img src="https://img-blog.csdn.net/20160503224309822?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" />
之后只会有p1对象调用setbook方法释放或者添加内存。
</pre><pre name="code" class="objc">[p1 release];  
p1释放内存,因为p1之前的计数器是1,自己先释放完,p1的计数器个数为0。
而在Person对象的实现文件中

</pre></p><p class="p1"><span class="s1">- (</span><span class="s2">void</span><span class="s1">)dealloc</span></p><p class="p1"><span class="s1">{</span></p><p class="p2"><span class="s3">    [</span><span class="s1">_book</span><span class="s3"> </span><span class="s1">release</span><span class="s3">];</span></p><p class="p3"><span class="s3">    </span><span class="s4">NSLog</span><span class="s3">(</span><span class="s1">@"person</span><span class="s5">对象被释放</span><span class="s1">"</span><span class="s3">);</span></p><p class="p1"><span class="s1">    [</span><span class="s2">super</span><span class="s1"> </span><span class="s4">dealloc</span><span class="s1">];</span></p><p class="p1"><span class="s1">}</span></p><pre name="code" class="objc">dealloc方法中调用了  
 [ _book   release ];  Book对象的计数器-1 ,此时b基本上完全释放掉了,Person也完全释放掉了。

如图

 对象的内存基本释放完全了。

 




 


  

 


 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值