OC中的内存管理01

news/2024/7/20 14:04:20 标签: 内存管理, xcode

一、内存管理要遵循的原则

1> 谁创建,谁release (看到 alloc、copy、new就应该有写release的冲动)。

2> 谁retain,谁release (简单的来说就是要负责嘛,不能retain后不管了)。

3> 说明下苹果在这方面做的很严谨,后面的学习会接触到ARC,Xcode会帮我们自动管理相应的内存。

二、基本原理

1> 每个对象的内部都封装的一个与之相关的整数,称之为引用计数器。

2> 当使用alloc、new或者copy创建对象时,计数器被设置为1。

3> 给对象发送一条retain消息时候,计数器要+1。(OC当中的消息机制)

4> 给对象发送一条release消息时候,计数器要-1。

5> 当对象的计数器变成0的时候,也就证明这个对象的内存被回收了,这个时候系统就会自动给这个对象发送一个dealloc消息,  一般会重写dealloc方法,在这里释放,一定不要直接调用dealloc方法

6> 可以给对象发送一个retainCount消息,获得当前引用计数器的值。

学生类的声明:

Student.h

1 #import <Foundation/Foundation.h>
2 #import "Book.h"
3 @interface Student
4 @property Book *book;
5 @end

学生类的实现:

Student.m

 1 #import "Student.h"
 2 @implementation Student 
 3 @synthesize book = _book;
 4 - (void)setBook:(Book *)book{
 5     if (book != _book) {
 6         [_book release];
 7         _book = [book retain];
 8     }
 9 }
10 - (void)dealloc {
11     [_book release];
12     [super dealloc];
13 }
14 @end

说明:自己管理内存泄露多发生在对象的set方法中对象换成员变量的时候(上述代码中出现在学生换书的时候,先判断是不是原来的那本书,然后对原来的书做一次release

,对现有的一本书做一次retain才符合内存管理的原则)。

三、@class 和 #import的区别

1> #import 方式引入,会包含被引用类的所有信息,包括引用类的方法和变量,@class只是告诉编译器有这个类的存在,然而类中的成员变量和方法编译器是不知道的,等在

实现中用到该类的时候在导入对应的头文件。

2> 假如一个类的头文件被许多文件引用,那么这个文件一旦改动了,后面引用这个类的文件都要重新编译,会比较麻烦,效率的话可想而知,但是@class却解决了这个问题。

3> 开发原则是所有类的声明全部放在.h中,类的实现全部放在.m中,如果用到某个类的方法和成员变量在用#import引入头文件。

Student.h改进:

1 #import <Foundation/Foundation.h>
2 @class Book;
3 @interface Student
4 @property (retain) Book *book;
5 @end

Student.m改进:

 1 #import "Student.h"
 2 #import "Book.h"
 3 @implementation Student 
 4 //@synthesize会自动展开setter和getter, 隐藏了内存管理细节
 5 @synthesize book = _book;
 6 - (void)dealloc {
 7     [_book release];
 8     [super dealloc];
 9 }
10 @end

 

转载于:https://www.cnblogs.com/nqs674/p/4780552.html


http://www.niftyadmin.cn/n/1059973.html

相关文章

SQL SERVER 数据库导出表设计

关注公众号及时获取文章更新参考文章&#xff1a;https://jingyan.baidu.com/article/27fa73269e3ef046f9271f79.html 当我们需要重复利用某个表的表结构设计&#xff0c;或者是想删除整个数据库中的数据&#xff0c;快速建立新的空值数据库时&#xff0c;会考虑到把表设计导出…

python+selenium_添加日志文件logger

import logging import os.path import time class Logger(object): def __init__(self, logger): """指定保存日志的文件路径&#xff0c;日志级别&#xff0c;以及调用文件 将日志存入到指定的文件中""" # 创建一个logger self.logger loggin…

Tobii pro lab学习笔记1

Tobii Pro Lab版本1.152 数据回放功能 一、概览 当我们把需要收集的数据导入到已经创建好的project中&#xff0c;可以看到每一条记录的情况 进入到我们具体的记录内容上面之后到这个页面&#xff1a; 在右侧&#xff0c;是对gaze data的一些基本介绍&#xff0c;可以看到这…

广义表(C++实现)

广义表是非线性结构&#xff0c;其定义是递归的。 以下给出几种简单的广义表模型&#xff1a; 由上图我们可以看到&#xff0c;广义表的节点类型无非head、value、sub三种&#xff0c;这里设置枚举类型&#xff0c;利用枚举变量来记录每个节点的类型&#xff1a; enum Type {H…

Tobii pro lab学习笔记2_数据可视化

数据可视化 可视化分为两大类&#xff0c;第一类是Heatmap热点图&#xff0c;第二类是Gaze plot轨迹图 对于热点图&#xff1a;颜色越深的地方&#xff0c;被试观察的越久 关于热点图的记录类型&#xff0c;有四种&#xff0c;绝对次数&#xff0c;相对次数&#xff0c;绝对注…

对于前端JS、Html、CSS的大小、位置是否影响网站的相应时间

1、页面中大量的注释代码、空行会影响页面的加载速度 尽量去除打断的注释代码&#xff0c;及空行&#xff1b;尽可能的使用压缩后的JS、CSS文件&#xff0c;太小的文件没必要压缩 2、有人说CSS样式放在页面的开头&#xff0c;JS文件放在页面的结尾&#xff0c;可以提高页面的加…

Revit二次开发DockableDialog (可停靠窗体)

关注公众号及时获取文章更新三个步骤 1、首先可停靠窗体为 Page 窗体&#xff0c;即WPF控件需继承自Page。此外还需继承 IDockablePaneProvider 接口&#xff0c;然后在WPF控件后台代码汇总实现函数SetupDockablePane。 2、在IExternalApplication的OnStartup函数中完成注册&…

关于存储过程可空条件查询

大家都知道使用存储过程的好处其中有2点 1、参数查询安全(用参数就安全&#xff1f;) 2、存储过程在创建时预编译&#xff0c;执行效率比SQL语句要高 基于这两点&#xff0c;看看下面这段以前经常写的存储过程吧(查询数据) CREATE PROCEDURE [dbo].[usp_TestExec]Account VARCH…