文档章节

内存管理三

langzhouzhou1
 langzhouzhou1
发布于 2016/03/19 17:40
字数 581
阅读 51
收藏 0

就按照前面几篇写的set get 太不严谨了,问题多多,set get还需要更好的写法;

还是老例子。

ViewController.m

#import "ViewController.h"
#import "Person.h"
#import "Dog.h"
@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    Dog * dog = [[Dog alloc]init];
    dog.age = 10;
    Person * person = [[Person alloc]init];
    
    Dog * whiteDog = [[Dog alloc]init];
    whiteDog.age = 1;
    
    person.dog = dog;
    person.dog = whiteDog;
    [dog release];
    dog = nil;
    
    [whiteDog release];
    whiteDog = nil;
    [person release];
    person = nil;
}

Person.h

#import <Foundation/Foundation.h>
#import "Dog.h"
@interface Person : NSObject
{
    Dog * _dog;
}

- (void)setDog:(Dog *)dog;
- (Dog *)dog;
@end

Person.m

#import "Person.h"

@implementation Person

- (void)setDog:(Dog *)dog
{
    _dog = [dog retain];
}

- (Dog *)dog
{
    return _dog;
}

- (void)dealloc
{
    [_dog release];
    NSLog(@"人被销毁了");
    [super dealloc];
}
@end

Dog.h

#import <Foundation/Foundation.h>

@interface Dog : NSObject
{
    int _age;
}

- (void)setAge:(int)age;
- (int)age;
@end

Dog.m

#import "Dog.h"

@implementation Dog
- (void)setAge:(int)age
{
    _age = age;//注意基本数据类型不用内存管理
}

- (int)age
{
    return _age;
}

-(void)dealloc
{
    NSLog(@"%d岁狗被销毁了",_age);
    [super dealloc];
}
@end

打印结果:

1岁狗被销毁了

人被销毁了

这样就有一个问题了,人不要了之前的10岁的狗,却没把发释放了。

在dog的set get里打印一下

- (void)setDog:(Dog *)dog
{
    NSLog(@"%d岁狗",_dog.age);
    _dog = [dog retain];
}
//结果:
0岁狗
10岁狗
1岁狗被销毁了
人被销毁了
/*
    应该发现了吧,每次在刚持有新的对象的时候,也就是retain之前的一步还是持有旧的对象的
    那就可以release了。
*/

改成这样:
- (void)setDog:(Dog *)dog
{
    [_dog release];
    _dog = [dog retain];
}
/*
    打印结果:
10岁狗被销毁了
1岁狗被销毁了
人被销毁了
这样比较完善了
*/

为什么平时在写set get的时候要加一个判断呢?这回就能明白了

- (void)viewDidLoad {
    [super viewDidLoad];
    //dog 引用计数1
    Dog * dog = [[Dog alloc]init];
    dog.age = 10;
    
    Person * person = [[Person alloc]init];
    //dog 引用计数2
    person.dog = dog;
    //dog 引用计数1
    [dog release];
    
    person.dog = dog;
    /*
    一不小心有多打了一次,啊啊啊。这是为什么,引用计数不是还为1么。这时候在写一遍person.dog = dog为什么会报错?
    person.dog要调用set get 方法了。
    而set get里面有这个
    
    - (void)setDog:(Dog *)dog
{
    [_dog release];//注意 这里高能,就是这里,再次调用这里就把release了,那不就为0了就被释放了。
    _dog = [dog retain];//而这里确还希望人死复生,当然报错
}

    */
    [person release];
    
    dog = nil;
    person = nil;
}

运行后报错。

改进后

- (void)setDog:(Dog *)dog
{
    if (_dog != dog) {
        
        [_dog release];
        _dog = [dog retain];

    }
}


© 著作权归作者所有

下一篇: 内存管理二
langzhouzhou1
粉丝 5
博文 131
码字总数 63910
作品 0
杭州
私信 提问
Memcached与Redis(三)

3. Memcached和Redis关键技术对比 作为内存数据缓冲系统,Memcached和Redis均具有很高的性能,但是两者在关键实现技术上具有很大差异,这种差异决定了两者具有不同的特点和不同的适用条件。下...

liujing07
2018/06/26
0
0
5课教你掌握linux内存管理之四-linux内存与I/O的交换

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 https://blog.csdn.net/21cnbao/article/details/95108569 Linux内存管理大纲: *page cache...

linux内存和进程
07/08
0
0
iOS开发知识点装逼1:理解assign,copy,retain变strong

举个例子: NSString *houseOfMM = [[NSString alloc] initWithString:'装梵几的三室两厅']; 上面一段代码会执行以下两个动作: 1 在堆上分配一段内存用来存储@'装梵几的三室两厅' ,比如:内存地...

openlab
2012/11/15
14.8K
3
深入理解Linux内存管理-之-目录导航

转自:https://blog.csdn.net/gatieme/article/details/52384965 1 内存描述 2 页表管理 3 初始化内存管理

zwfgogo
2018/04/20
0
0
十一步让你理解linux的内存映射

零:32位操作系统只有4G的虚拟地址空间,linux将最上的1G用于内核虚拟地址。 一:linux将物理内存完全一一映射到内核空间,这样很方便管理内存,任何页面的虚拟地址减去一个0xc0000000的偏移...

晨曦之光
2012/04/10
196
0

没有更多内容

加载失败,请刷新页面

加载更多

cpu load过高问题排查

load average的概念 top命令中load average显示的是最近1分钟、5分钟和15分钟的系统平均负载。 系统平均负载被定义为在特定时间间隔内运行队列中(在CPU上运行或者等待运行多少进程)的平均进程...

mskk
35分钟前
5
0
用spring boot 实现websocket

import java.io.IOException;import javax.websocket.OnClose;import javax.websocket.OnError;import javax.websocket.OnMessage;import javax.websocket.OnOpen;import java......

jingshishengxu
46分钟前
4
0
shell介绍,命令历史,命令补全和别名,通配符,输入输出重定向,管道符和作业控制

shell介绍 可以使用 yum list |grep zsh 或者 yum list |grep ksh 这样可以搜索 zsh 和 ksh ,有需要的话可以安装 总之,默认使用的就是 .bash shell 命令历史 输入过的命令会被保存在一个文...

doomcat
今天
7
0
1995年的资深工程师,和你谈谈如何进阶

1995年的资深工程师,和你谈谈如何进阶 自我介绍 网络ID:杭城小刘,城市:顾名思义,人在杭州。1995年出生,本科毕业,现在是一名 iOS 资深工程师,年薪 35w。兴趣爱好广泛:乒乓球、美食、...

杭城小刘
今天
10
0
Kafka 面试题

1.Kafka中的ISR、AR代表什么? ISR:与leader保持同步的follower集合 AR:分区的所有副本 2.Kafka中的HW、LEO分别代表什么? LEO:每个副本的最后条消息的offset HW:一个分区中所有副本最小...

GrayWorld
今天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部