热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

ObjectiveC内存管理(一)

OC内存管理黄金法则(译文):如果一个对象使用了alloc,[mutable]copy,retainÿ

 

OC内存管理黄金法则(译文):如果一个对象使用了alloc,[mutable]copy,retain,那么你必须使用相应的release或者autorelease释放。

Xcode建立Command Line Tool项目:DogSample,选择手动管理内存,并添加Dog和Person类。

Dog有唯一标识的ID属性,Dog.h代码:

#import @interface Dog : NSObject
{
int _ID;
}@property
int ID;@end

添加对象retainCount=0时自动调用的dealloc 函数,Dog.m代码:

#import "Dog.h"@implementation Dog@synthesize ID = _ID;- (void) dealloc
{NSLog(
@"Dog %d is dealloc ...", _ID);[super dealloc];
}
@end

 

Person对象有Dog属性,表示某某人拥有某某狗,Person.h

#import
#import "Dog.h"@interface Person : NSObject
{Dog
*_dog;
}
- (void) setDog:(Dog *)newDog;
- (Dog *) dog;@end

同样,Person.m代码如下:

#import "Person.h"
#import "Dog.h"@implementation Person- (void) setDog:(Dog *)newDog;
{
//暂时不写
}- (Dog *) dog
{
return _dog;
}
- (void) dealloc
{NSLog(
@"Person is dealloc ...");[super dealloc];
}
@end

 

下面我们来看main.m的实现,首先创建一条狗狗和人类小丽,我们用 [xiaoLi setDog:dog1]; 表示小丽拥有dog1

#import
#import "Dog.h"
#import "Person.h"int main(int argc, const char * argv[])
{@autoreleasepool {
//NSLog(@"Hello, World!");
Dog *dog1 = [[Dog alloc] init];[dog1 setID:1];Person *xiaoLi = [[Person alloc] init];//小丽拥有狗狗 dog1
[xiaoLi setDog:dog1];}return 0;
}

那么Person.m的setDog函数具体该如何实现呢?画图分析:

 

1.我们需要把 dog1赋值给xiaoLi对象的_dog属性,让小丽拥有dog1

2.所以dog1指向的对象其现在应该是reatainCount=2了,所以setDog函数添加如下代码:

if(newDog != _dog){_dog = [newDog retain];
}

现在假设我们release人类xiaoLi,那么Dog的retainCount=1还是retainCount=2 ??我们写一下代码测试:

[xiaoLi release];NSLog(@"xiaoli release, dog1 retainCount is %lu", [dog1 retainCount]);

运行结果:

Person is dealloc ...
xiaoLi release, Dog retainCount is 2

引用计数器仍然是2,说明当我们释放xiaoLi的时候,并没有因为_dog属性指向Dog对象的关系而自动执行 [dog1 retain],而是需要我们手动去实现:

- (void) dealloc
{NSLog(
@"Person is dealloc ...");//添加代码:需要手动使Dog的retainCount减1
[_dog release];[super dealloc];
}

这时候的内存示意图如下:

 

点击这里下载源代码

 

 

 

 

 


转:https://www.cnblogs.com/reveyjay/archive/2012/05/20/2510847.html



推荐阅读
  • STL迭代器的种类及其功能介绍
    本文介绍了标准模板库(STL)定义的五种迭代器的种类和功能。通过图表展示了这几种迭代器之间的关系,并详细描述了各个迭代器的功能和使用方法。其中,输入迭代器用于从容器中读取元素,输出迭代器用于向容器中写入元素,正向迭代器是输入迭代器和输出迭代器的组合。本文的目的是帮助读者更好地理解STL迭代器的使用方法和特点。 ... [详细]
  • 手把手教你使用GraphPad Prism和Excel绘制回归分析结果的森林图
    本文介绍了使用GraphPad Prism和Excel绘制回归分析结果的森林图的方法。通过展示森林图,可以更加直观地将回归分析结果可视化。GraphPad Prism是一款专门为医学专业人士设计的绘图软件,同时也兼顾统计分析的功能,操作便捷,可以帮助科研人员轻松绘制出高质量的专业图形。文章以一篇发表在JACC杂志上的研究为例,利用其中的多因素回归分析结果来绘制森林图。通过本文的指导,读者可以学会如何使用GraphPad Prism和Excel绘制回归分析结果的森林图。 ... [详细]
  • 篇首语:本文由编程笔记#小编为大家整理,主要介绍了iOS开发--漫谈内存管理相关的知识,希望对你有一定的参考价值。 ... [详细]
  • Objective C接入Sonar代码扫描
    目录技术方案环境准备扫描器配置项目配置SonarQube配置jenkins接入一些坑技术方案Sonar本身有对OC的代码扫描插件——SonarCFamily,但是是收费的。出于成本 ... [详细]
  • 多态性这个词表示有许多形式。通常,当存在类的层次结构并且通过继承相关时,会发生多态性。Objective-C多态表示对成员函数的调用将导致执行不同的函数,具体取决于调用该函数的对 ... [详细]
  • 本文详细介绍了GetModuleFileName函数的用法,该函数可以用于获取当前模块所在的路径,方便进行文件操作和读取配置信息。文章通过示例代码和详细的解释,帮助读者理解和使用该函数。同时,还提供了相关的API函数声明和说明。 ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • 本文讨论了clone的fork与pthread_create创建线程的不同之处。进程是一个指令执行流及其执行环境,其执行环境是一个系统资源的集合。在调用系统调用fork创建一个进程时,子进程只是完全复制父进程的资源,这样得到的子进程独立于父进程,具有良好的并发性。但是二者之间的通讯需要通过专门的通讯机制,另外通过fork创建子进程系统开销很大。因此,在某些情况下,使用clone或pthread_create创建线程可能更加高效。 ... [详细]
  • 本文介绍了深入浅出Linux设备驱动编程的重要性,以及两种加载和删除Linux内核模块的方法。通过一个内核模块的例子,展示了模块的编译和加载过程,并讨论了模块对内核大小的控制。深入理解Linux设备驱动编程对于开发者来说非常重要。 ... [详细]
  • 预备知识可参考我整理的博客Windows编程之线程:https:www.cnblogs.comZhuSenlinp16662075.htmlWindows编程之线程同步:https ... [详细]
  • C语言常量与变量的深入理解及其影响
    本文深入讲解了C语言中常量与变量的概念及其深入实质,强调了对常量和变量的理解对于学习指针等后续内容的重要性。详细介绍了常量的分类和特点,以及变量的定义和分类。同时指出了常量和变量在程序中的作用及其对内存空间的影响,类似于const关键字的只读属性。此外,还提及了常量和变量在实际应用中可能出现的问题,如段错误和野指针。 ... [详细]
  • 本文分析了Wince程序内存和存储内存的分布及作用。Wince内存包括系统内存、对象存储和程序内存,其中系统内存占用了一部分SDRAM,而剩下的30M为程序内存和存储内存。对象存储是嵌入式wince操作系统中的一个新概念,常用于消费电子设备中。此外,文章还介绍了主电源和后备电池在操作系统中的作用。 ... [详细]
  • iOS 类簇及越界处理
     估计做iOS开发的朋友都遇到多一个问题,就是数组越界,-[__NSArray0objectAtIndex:]:index1beyondboundsforemptyNSArray’ ... [详细]
  • 我的iOS开发入门自学路径
    我有一个清单,列着希望在大学里完成的事。比如,学一门乐器,和朋友去旅游,搭建自己的博客,去滑翔,看各主题的书籍。其中一项是,写自己的App并且上架。去年开始,我准备完成这一项,所以 ... [详细]
  • 文章框架前言呀!!再也不三心二意了,从今往后专心搞iOS!嗯!从大一开始就嚷嚷对iOS热爱的很,结果呢,就毕设写了个垃圾,咦!所以现在起,iOS就是我的主线了!先写这篇垃圾文章壮壮 ... [详细]
author-avatar
雪影飘枫2502928577
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有