多对象的内存管理
多对象的内存管理。 在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也完全释放掉了。
如图
对象的内存基本释放完全了。