Objective-C:内存管理的小结
内存管理:
对于对象类型的实例变量,可以使用@property自动生成相应地存取方法,
但@property中必须要采用retain的内存设置;
assign用于基本的数据类型,不需要获取所有权的类型。
ARC:
strong 相当于MRC中的retain
assign 用于基本的数据类型
weak 不需要获取所有权的对象类型
unsafeunretain 用在不支持weak的旧版本中
对象复制中的浅复制和深复制:
浅复制:复制对象时,如果对象中包含对象类型的实例变量,只是复制指针。新对象中的对象类型实例变量和旧对象中的对象类型实例变量指的是同一个对象。任何一方实例变量对对象做修改,另一方实例变量指向的该对象也就改变了。
深复制:复制对象时,如果对象中包含对象类型的实例变量,要对对象类型的实例变量也要做对象复制。新对象中的对象类型实例变量和旧对象中的对象类型实例变量指的是不同的对象。不管任何一方实例变量对对象做修改,都互相不影响对方所指向的对象的内容。
用网上一哥们通俗的话将就是:
浅复制好比你和你的影子,你完蛋,你的影子也完蛋
深复制好比你和你的克隆人,你完蛋,你的克隆人还活着。
8、自动释放池(管理需要延迟释放的对象)
由new、copy、alloc创建的对象不会自动入池,需要通过发送autorelease消息,将一个对象添加到其中,以便最后释放:[MyFranction autorelease]
#import <Foundation/Foundation.h>
#import "Book.h"
void ex1();
void ex2();
void ex3();
void ex4();
void ex5();
int main(int argc, const char * argv[])
{
//ex1();
//ex2();
//ex3();
//ex4();
ex5();
return ;
}
(1)创建自动释放池的两种方法:
-NSAutoreleasePool *pool = [[NSAutoreleasePool alloc]init]
[pool release]《==等价于==》[pool drain];
void ex1()
{
//创建一个自动释放池对象
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc]init];
//自动释放池的使用
Book *book = [[Book alloc]initWithTitle:@"OC" andAuthor:@"Jobs" andPrice:35.6]; //将book对象加入自动释放池
[book autorelease];
[book print]; NSLog(@"autorelease last");
//清空自动释放池--会给每个管理的对象发送release消息
[pool release];//===[pool drain]
}
或者
-@autoreleasePool
{
}
//创建自动释放池的第一种方式
void ex2()
{
@autoreleasepool { //自动释放池的使用
Book *book = [[Book alloc]initWithTitle:@"OC" andAuthor:@"Jobs" andPrice:35.6]; //将book对象加入自动释放池
[book autorelease];
[book print]; NSLog(@"autorelease last");
}//在自动释放池结束时,会给每个管理的对象发送release消息
}
(2)延迟释放对象
在OC的内置类(NSString、NSArray等)中提供的类方法创建的对象实例都是“延迟释放对象”,也就是在对象创建完成后将对象加入自动释放池。
+(Book*)bookWithTitle:(NSString*)title andAuthor:(NSString*)author andPrice:(CGFloat)price
{
return [[[Book alloc]initWithTitle:title andAuthor:author andPrice:price]autorelease];
}
void ex3()
{
@autoreleasepool {
//这种对象不需要我们去给它们发release消息。
Book *book = [Book bookWithTitle:@"OC" andAuthor:@"Jobs" andPrice:35.6];
[book print];
//[book release];
}
}
(3)自动释放池的嵌套
对象在加入自动释放池时,加入的是离它最近的自动释放池,目的是为了让延迟释放的对象尽快得到释放,降低程序运行期间的内存占用;
在管理多个自动释放池时,采用了类似“栈”的结构,可以让对象轻松的找到离它最近的(栈顶的)自动释放池。
+(Book*)bookWithTitle:(NSString*)title andAuthor:(NSString*)author andPrice:(CGFloat)price
{
return [[[Book alloc]initWithTitle:title andAuthor:author andPrice:price]autorelease];
}
void ex4()
{
@autoreleasepool {
Book *book = [Book bookWithTitle:@"iOS" andAuthor:@"Bill" andPrice:55.6];
[book print];
@autoreleasepool {
Book *book2 = [Book bookWithTitle:@"iOS" andAuthor:@"Bill" andPrice:55.6];
[book2 print];
}
}
}
(4)独立的自动释放池
当程序中出现创建大量延迟释放对象的代码时,最好给它一个独立的自动释放池,保证这些对象在不用了后马上释放掉
+(Book*)bookWithTitle:(NSString*)title andAuthor:(NSString*)author andPrice:(CGFloat)price
{
return [[[Book alloc]initWithTitle:title andAuthor:author andPrice:price]autorelease];
}
void ex5()
{
@autoreleasepool {
for(int i=; i<; i++)
{
@autoreleasepool {//独立的自动释放池
Book *book = [Book bookWithTitle:[NSMutableString stringWithFormat:@"book%d",i+] andAuthor:[NSMutableString stringWithFormat:@"author%d",i+ ] andPrice:+i];
[book print];
}
}
}
}
Objective-C:内存管理的小结的更多相关文章
- Objective C内存管理之理解autorelease------面试题
Objective C内存管理之理解autorelease Autorelease实际上只是把对release的调用延迟了,对于每一个Autorelease,系统只是把该Object放入了当前的A ...
- Objective C 内存管理[转]
1 配对原则 alloc – release new – release retain - release copy – release 2 new和alloc-init的区别 (1)区别只在于a ...
- 黑马程序员——OC的内存管理学习小结
内存管理在Objective-C中的重要性就像指针在C语言中的重要程序一样. 虽然作为一门高级语言,但OC却没有内存回收机制.这就需要开发者来对动态内存进行管理.OC中内存管理的范围是:任何继承了NS ...
- objective C 内存管理及属性方法具体解释
oc为每一个对象提供一个内部计数器.这个计数器跟踪对象的引用计数,当对象被创建或拷贝时.引用计数为1.每次保持对象时,调用retain接口.引用计数加1.假设不需要这个对象时调用release,引用计 ...
- Objective -C Memory Management 内存管理 第一部分
Objective -C Memory Management 内存管理 第一部分 Memory management is part of a more general problem in pr ...
- javascript 变量,作用域,内存管理小结
js的变量保存两种类型的数据——基本数据类型与引用类型.具有以下几点特征: 变量: 1)基本类型值在内存中占固定大小的空间,因此被保存在栈内存中; 2) 把保存基本类型值得变量赋给另一个变量,会创 ...
- Objective-C(内存管理)
引用计数器 每个OC对象都有一个占4个字节存储空间的引用计数器 当使用或创建一个对象时,新对象的引用计数器默认是1 retain:可以使引用计数器+1 release:可以是引用计数器-1 retai ...
- Objective C----手动管理内存和自动管理内存
对象的引用计数(Reference Counting) 正常情况下,当一段代码需要访问某个对象时,该对象的引用的计数加1:当这段代码不再访问该对象时,该对象的引用计数减1,表示这段代码不再访问该对象: ...
- AJPFX的内存管理小结
管理范围:任何继承于 NSObject的对象原理:每一个对象都有引用计数器当使用alloc new 和 copy创建对象时引用计数器被设置为1给对象发送一条retain消息 ,引用计数器加1 ...
随机推荐
- 【原创】MySQL CPU %sys高的案例分析(二)
后面又做了补充测试,增加了每秒context switch的监控,以及SQL执行时各步骤消耗时间的监控. [测试现象一] 启用1000个并发线程的压测程序,保持压测程序持续运行,保持innodb_sp ...
- MySQL 关于索引那点事
索引 其实数据库中的数据是按页存放的其实索引也是按页存放的所以本质上索引也占硬盘空间(以最小的消耗,换取最大的利益) 索引是一种有效组合数据的方式!为快速查找到指定记录做铺垫 目的就是快速或者某个记录 ...
- android httpUrlConnection HttpClient
韩梦飞沙 韩亚飞 313134555@qq.com yue31313 han_meng_fei_sha httpUrlConnection 超文本传输协议统一资源定位器连接 http 超 ...
- Spring的模块组成
Spring的模块组成 1.核心容器:核心容器提供 Spring 框架的基本功能(Spring Core).核心容器的主要组件是 BeanFactory,它是工厂模式的实现. BeanFactory ...
- [BZOJ4487][JSOI2015]染色问题(容斥)
一开始写了7个DP方程,然后意识到这种DP应该都会有一个通式. 三个条件:有色行数为n,有色列数为m,颜色数p,三维容斥原理仍然成立. 于是就是求:$\sum_{i=0}^{n}\sum_{j=0}^ ...
- 压缩的问题-----WriteUp
原题:http://ctf5.shiyanbar.com/crypto/winrar/ 526172211A0700CF907300000D0000000000000056947424965E 006 ...
- 20162327WJH实验四——图的实现与应用
20162327WJH实验四--图的实现与应用 实 验 报 告 课程:程序设计与数据结构 班级: 1623 姓名: 王旌含 学号:20162327 成绩: 指导教师:娄嘉鹏 王志强 实验日期:11月2 ...
- SQL Server中执行正则表达式
总体方案:写function,再执行update语句. 一.查询函数 -- ============================================= -- Author: <l ...
- Codeforces Round #243 (Div. 1)A. Sereja and Swaps 暴力
A. Sereja and Swaps time limit per test 1 second memory limit per test 256 megabytes input standard ...
- Codeforces Round #288 (Div. 2) B. Anton and currency you all know 贪心
B. Anton and currency you all know time limit per test 0.5 seconds memory limit per test 256 megabyt ...