首页 > 系统相关 >内存计数基础原理

内存计数基础原理

时间:2023-02-19 22:38:10浏览次数:49  
标签:Person mahongmin 计数 Book 内存 import release 原理 book

有new、alloc、copy(计数器加一),就得release(计数器减一)




//
// Person.h
// a1
//
// Created by mahongmin on 14-4-21.
// Copyright (c) 2014年 mahongmin. All rights reserved.
//

#import <Foundation/Foundation.h>
#import "Book.h"

@interface Person : NSObject
{
Book *_book;
}

- (void) setBook:(Book*)book;
- (Book*) book;

@end



================


//
// Person.m
// a1
//
// Created by mahongmin on 14-4-21.
// Copyright (c) 2014年 mahongmin. All rights reserved.
//

#import "Person.h"

@implementation Person


- (void) setBook:(Book*)book
{
if (book != _book)// 防止p.book = b; 再来一次p.book = b
{
[_book release];// 此场景:如果p.book = b1,然后p.book = b2 那么,就需要此行来把b1 release掉。

_book = [book retain];// book传递进来,那么等于Person对book进行了一次占用 内存占用+1
}
}

- (Book*) book
{
return _book;
}

-(void)dealloc
{
// 当销毁人的时候,需把人占用的book也销毁
[_book release];

NSLog(@"释放人对象");
[super dealloc];
}

@end
======================
//
// Book.h
// a1
//
// Created by mahongmin on 14-4-23.
// Copyright (c) 2014年 mahongmin. All rights reserved.
//

#import <Foundation/Foundation.h>

@interface Book : NSObject

@end


===========================
//
// Book.m
// a1
//
// Created by mahongmin on 14-4-23.
// Copyright (c) 2014年 mahongmin. All rights reserved.
//

#import "Book.h"

@implementation Book

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

@end


====================================
//
// main.m
// a1
//
// Created by mahongmin on 14-4-21.
// Copyright (c) 2014年 mahongmin. All rights reserved.
//

#import <Foundation/Foundation.h>
#import "Person.h"
#import "Book.h"

int main(int argc, const char * argv[])
{
Person *p = [[Person alloc] init];

Book *b = [[Book alloc] init];

p.book = b;//此时,b指针指向的Book,计数为2

[b release];
b = nil;
[p release];// 如果多次乱调[r release],写了p=nil后,此处不会再报EXC_BAD_ACCESS野指针错误。此时p为空对象,给空对象发送消息,不会产生空指针错误。跟java不一样
p = nil;
return 0;
}

标签:Person,mahongmin,计数,Book,内存,import,release,原理,book
From: https://blog.51cto.com/u_21817/6066891

相关文章

  • Vue数据响应式底层原理
    Vue数据响应式底层原理数据响应式定义:(当数据变化的时候,会自动运行一些相关函数)原理就是通过Object.defineProperty()对属性进行劫持,当访问该属性时我们就收集依赖,当数......
  • 浅谈strtok函数的原理与使用
    对于strok函数的理解,自己也是很迷茫,尤其看到有的范例将第一参数设为NULL也很是不解,也是找了许多博文,并看了官方的英文文档才浅显地理解了。这位前辈的博文对我启发很大。链......
  • 深度剖析 ZooKeeper 核心原理 学习笔记
    什么是ZooKeeper假设对ZooKeeper中的数据做了变更(比如新增了一台Kafka或者挂掉了一个Kafka节点),这时候ZooKeeper会主动通知其他监听这个数据的客户端,立即告诉其他......
  • 微机原理与系统设计笔记5 | 总线及其形成
    打算整理汇编语言与接口微机这方面的学习记录。本部分介绍8086的总线。参考资料西电《微机原理与系统设计》周佳社西交《微机原理与接口技术》课本《汇编语言与......
  • STM32的内存管理相关(内存架构,内存管理,map文件分析)
    flash内存的和RAM中不同,RAM放databass;falsh中textdata——因此数据和代码是分开存储的为哈弗结构,而x86RAM较大,可以同时存下所以是冯诺依曼STM32的内存管理相关(内存......
  • C语言进阶--内存中的浮点数
    浮点数的转换--将浮点数转换成二进制--用科学计数法表示二进制浮点数--计算指数偏移后的值注意:计算指数时需要加上偏移量,而偏移量的值与类型有......
  • 字符分割并计数
    从文件中读取一行字符,对字符按逗号分割成单词,并计算每个单词出现次数#include<stdio.h>#include<stdlib.h>#include<string.h>typedefstructword{charstr[32......
  • MD5算法原理
    1、数据填充对消息进行数据填充,使消息的长度对512取模得448,设消息长度为X,即满足Xmod512=448。根据此公式得出需要填充的数据长度。填充方法:在消息后面进行填充,填充第一......
  • 多线程计数 AtomicInteger
    大家在工作中肯定遇到过计数统计需求,单线程的情况下count直接定义int型就行,可是在多线程并发下会产生多个线程同时count++的情况,那么这种情况就需要用到AtomicInteger来保......
  • threadlocal 原理详解
    ThreadLocal的基本概念在多线程并发中,我们需要保证共享变量(临界区)的安全性,因此在前面说起过synchronized和Lock锁,其中synchronized锁可以修饰方法或代码块,Lock锁可以修饰......