Objective-C学习笔记_内存管理(二)

一、属性的内部实现原理

assign的属性内部实现

setter方法:

// setter方法
@property (nonatomic, assign) NSString *name;

- (void)setName:(NSString *)name
{
  _name = name;
}

getter方法:

// getter方法
- (NSString *)name
{
  return _name;
}

观察下面代码会出现什么问题?

NSString *name = [[NSString alloc] initWithFormat:@”张三”];
Person *p = [[Person alloc] init];
[p setName:name];
[name release];
NSLog(@”%@”, [p name]); // 如果对象类型使用assign之后,会出现野指针异常
[p release];

retain的属性内部实现

setter方法:

// setter方法
@property (nonatomic, retain) NSString *name;

- (void)setName:(NSString *)name
{
  if(_name != name) {
    [_name release];
    _name = [name retain];
  }
}

getter方法:

// getter方法
- (NSString *)name
{
  return [[_name retain] autorelease];
}

copy的属性内部实现

setter方法:

// setter?法
@property (nonatomic, copy) NSString *name;

- (void)setName:(NSString *)name
{
  if(_name != name) {
    [_name release];
    _name = [name copy];
  }
}

getter方法:

// getter方法
- (NSString *)name
{
  return [[_name retain] autorelease];
}

二、dealloc内释放实例变量

dealloc是NSObject的?个实例方法,与alloc对应,用于回收开辟的内存空间。这个?法在对象引用计数为0时,由系统自动调用通常我们在dealloc中释放类的实例变量。

dealloc使用

以Person.m为示例,代码如下:

- (void)dealloc
{
  [_name release];  //释放setter?法泄露的实例变量
  [super dealloc];
}

注意:

  • 永远不要?动调用dealloc。
  • 在dealloc?法的最后一?,必须写[super dealloc];

三、便利构造器?法的实现原理

以Person.m为示例,代码如下:

+ (id)personWithName:(NSString *)name
{
  Person *p = [[Person alloc] initWithName:name];
  return [p autorelease];
}

return [p autorelease];是最完美的解决?案,既不会内存泄露,也不会产?野指针。


四、collection的内存管理

collection就是NSArray,NSDictionary,NSSet…等容器类,collection会自主管理?己内部的元素。

collection内存的?主管理,加入collection中的对象会被retain,移除出collection的对象会被release,collection被释放会对内部所有对象release。


版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-11-11 10:39:55

Objective-C学习笔记_内存管理(二)的相关文章

Objective-C学习笔记_内存管理(一)

一.内存管理的?式 大家都去过图书馆,而图书馆里的书是可以借出的.我们来设想这样一个场景,大家都去借书,但是从来没有人去还书,那么最后,这个图书馆会因为无书可借而倒闭,每个人都没法再使用图书馆.计算机也是这样,当程序运行结束时,操作系统将回收其占用的资源.但是,只要程序运行就会占用资源,如果不进行清理已经不用的资源,资源最终将被耗尽,程序将崩溃. 学会内存管理我们就明白什么时候由你释放对象,什么时候你不能释放.C语言中通过malloc.calloc.realloc和free搭配对内存进行管理.但

黑马程序员_IOS开发_Objective-C学习笔记_内存管理

1.内存管理概述 1.1什么是内存管理:内存管理是程序设计中常用的资源管理的一部分,每个计算机系统可供程序使用的内存都是有限的. 1.2为什么要使用内存管理:当我们的程序运行结束的时候,操作系统将回收其我们程序占用内存.但是,只要程序还在运行,它就会一直占用内存.如果不进行及时清理不用的内存,内存最终将被耗尽.每个程序都会使用内存,我们必须确保在需要的时候分配内存,而在程序运行结束时释放占用的内存.如果我们只分配而不释放内存,将发生内存泄漏. 1.3引用计数:1.3.1只有当你对一个对象了all

linux kernel学习笔记-5内存管理(转)

http://blog.sina.com.cn/s/blog_65373f1401019dtz.htmllinux kernel学习笔记-5 内存管理1. 相关的数据结构 相比用户空间而言,在内核中分配内存往往受到更多的限制,比如内核中很多情况下不能睡眠,此外处理内存分配失败也不像用户空间那么容易.内核使用了页和区两种数据结构来管理内存: 1.1 页 内核把物理页作为内存管理的基本单位.尽管CPU的最小可寻址单位通常为字(甚至字节),但是MMU(内存管理单元,管理内存并把虚拟地址转换为物理地址的

Object C学习笔记26-文件管理(二)

上一篇简单的介绍了如何获取文件属性,删除,拷贝文件等,本文继续记录Object C中文件IO操作. 一. 获取文件的执行主目录 在Object C中提供了一个方法 NSHomeDirectory() 用于获得执行执行的主目录,使用如下代码测试: NSString *homePath=NSHomeDirectory(); NSLog(@"执行文件的主目录:%@",homePath); 通过以上代码可以正确的输出应用程序的执行目录,上一张也提到了文件的目录问题,这个和Windows系统的有

Linux System Programming 学习笔记(九) 内存管理

1. 进程地址空间 Linux中,进程并不是直接操作物理内存地址,而是每个进程关联一个虚拟地址空间 内存页是memory management unit (MMU) 可以管理的最小地址单元 机器的体系结构决定了内存页大小,32位系统通常是 4KB, 64位系统通常是 8KB 内存页分为 valid or invalid: A valid page is associated with an actual page of data,例如RAM或者磁盘上的文件 An invalid page is

操作系统概念学习笔记 16 内存管理(二) 段页

操作系统概念学习笔记 16 内存管理 (二) 分页(paging) 分页(paging)内存管理方案允许进程的物理地址空间可以使非连续的.分页避免了将不同大小的内存块匹配到交换空间上(前面叙述的内存管理方案都有这个问题,当位于内存中的代码和数据需要换出时,必须现在备份存储上找到空间,这是问题就产生了.备份存储也有前面所述的与内存相关的碎片问题,只不过访问更慢). 传统上,分页支持一直是由硬件来处理的.最近的设计是通过将硬件和操作系统相配合来实现分页. 基本方法 实现分页的基本方法设计将物理内存分

计算机操作系统学习笔记_7_内存管理 --内存管理基础

h2.western { font-family: "Liberation Sans",sans-serif; font-size: 16pt; }h2.cjk { font-family: "微软雅黑"; font-size: 16pt; }h2.ctl { font-family: "AR PL UMing CN"; font-size: 16pt; }h1 { margin-bottom: 0.21cm; }h1.western { fon

计算机操作系统学习笔记_8_内存管理 --虚拟内存管理

td p { margin-bottom: 0cm; }h2.western { font-family: "Liberation Sans",sans-serif; font-size: 16pt; }h2.cjk { font-family: "微软雅黑"; font-size: 16pt; }h2.ctl { font-family: "AR PL UMing CN"; font-size: 16pt; }h1 { margin-botto

嵌入式linux学习笔记1—内存管理MMU之虚拟地址到物理地址的转化

一.内存管理基本知识 1.S3C2440最多会用到两级页表:以段的方式进行转换时只用到一级页表,以页的方式进行转换时用到两级页表.页的大小有三种:大页(64KB),小页(4KB),极小页(1KB).条目也称为"描述符",有:段描述符,大页描述符,小页描述符,极小页描述符——他们保存大页,小页,极小页的起始物理地址:粗页表描述符,细页表描述符——他们保存二级页表的物理地址. 2.一级页表描述符的最低两位,可分为以下四种情况: (1).0b00:无效. (2).0b01:粗页表. (3).