内存管理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
内存管理2-set方法的内存管理相关推荐
- 4用计算机显示内存不足,必成电脑:解决电脑提示“内存不足”四种方法-电脑内存不足怎么办...
1.打开的程序太多 如果同时打开的应用软件过多或者运行的文档过多,就没有足够的内存运行其他程序.这时,对于多文档界面(MDl)程序,如Wd.Excel等,请关闭当前文档外的所有文档,并退出当前未使用的 ...
- 软件需求管理用例方法 pdf_一卡通管理软件功能需求
一卡通管理软件功能需求 1)一卡通管理软件主要业务功能 根据分析,学院一卡通管理软件目前共考虑了如下功能: 消费类功能:餐厅消费.文体活动中心消费. 餐厅消费.文体活动中心消费的规则完成一致.即采用& ...
- 内存泄露、内存溢出以及解决方法
目录(?)[+] 内存泄露是指程序在运行过程中动态申请的内存空间不再使用后没有及时释放,从而很可能导致应用程序内存无线增长.更广义的内存泄露包括未对系统的资源的及时释放,比如句柄等. 内存溢出即用户在 ...
- 浅谈手机内存不够的解决方法--我的手机是红米note5
手机内存不够的解决方法 手机内存不够的解决方法 我为什么要关系内存问题? 应用搬到sd卡的方法 link2sd 刷机 注意 手机内存不够的解决方法 清理内存 大概卸载一些暂时不用的软件 我为什么要关系 ...
- android内存池,两种常见的内存管理方法:堆和内存池
描述 本文导读 在程序运行过程中,可能产生一些数据,例如,串口接收的数据,ADC采集的数据.若需将数据存储在内存中,以便进一步运算.处理,则应为其分配合适的内存空间,数据处理完毕后,再释放相应的内存空 ...
- 关于内存管理/set/get方法
MRC状态下 1 任何继承NSObject的对象,存放于堆控件中,都需要手动管理内存 . 2 基本数据类型放到栈中,对象放到堆空间中,内存是有系统管理的.(int\float\enum\struct) ...
- python内存管理方法_Python 内存管理大揭秘
前言 语言的内存管理是语言设计的一个重要方面.它是决定语言性能的重要因素.无论是C语言的手工管理,还是Java的垃圾回收,都成为语言最重要的特征.这里以Python语言为例子,说明一门动态类型的.面向 ...
- 4.4OC10-内存管理2-set方法的内存管理
4.4OC10-内存管理2-set方法的内存管理 例一: main.m // // main.m // OC10-内存管理2-set方法的内存管理 // // Created by qwz o ...
- linux内存管理的主要概念是虚拟内存,你知道linux内存管理基础及方法?
描述 一.基本概念 (1)物理内存和虚拟内存 物理内存:系统硬件提供的真实物理内存 虚拟内存:利用磁盘空间虚拟出的一块逻辑内存,用作虚拟内存的磁盘空间被称为swap,swap类似于windows的虚拟 ...
- php的内存划分,解析PHP中的内存管理,PHP动态分配和释放内存
摘要 内存管理对于长期运行的程序,例如服务器守护程序,是相当重要的影响:因此,理解PHP是如何分配与释放内存的对于创建这类程序极为重要.本文将重点探讨PHP的内存管理问题. 一. 内存 在PHP中,填 ...
最新文章
- numpy和scipy安装
- 重启openssl服务linux,Nginx的启动、停止与重启---linux
- python爬取内容乱码_【提问】PYTHON 爬取下来的中文数据显示乱码
- MATLAB中估算运行时间-tic、toc用法
- NCoreCoder.Aop详解
- 爬虫实战学习笔记_7 【实战】模拟下载页面视频(模板)
- Java利用二维数组判断节假日_《剑指offer》面试题3 二维数组中的查找 Java版
- 为并发而生的 ConcurrentHashMap,基于 Java8 分析
- 解决 VMWARE MAC 10.12无法全屏的问题
- 【物理】概念的理解 —— 蒸馏、萃取
- 《图解深度学习》学习笔记(一)
- 计算机网络波特率定义,传输速率——比特率和波特率
- 魔方优化大师 v5.15 中文绿色版
- linux上打开tif格式图片,tif图片格式介绍及其打开方式
- 计算机视觉的网站收集
- 样本量重要,还是测序深度重要?
- ROS(ERROR):Rosdep cannot find all required resources to answer your query
- 嵌入式开发设备的组成
- 目标检测算法中ROI提取方法比较+源码分析
- Veri2. VCS behavioral analysis for the un-driven port
热门文章
- 你知道前端工程师的发展方向吗?
- java 全局返回码设计_服务返回码的设计
- python自动登录qq空间_python 利用splinter组件,自动登录QQ空间
- c++读取文件夹下特定文件
- 广域网访问局域网路由器设置_交换机路由器如何连接 交换机路由器连接方法【详解】...
- centos设置启动mysql,Centos设置开机启动Apache和Mysql
- HDU-基础搜索总结
- 图像算法七:【形态学图像处理】二值运算、膨胀、腐蚀
- linux内存管理(二)-内存数据结构分析
- Linux下查看CPU个数