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 拾遗提高(函数、事务、索引)
目录 1.tips 2.事务(transaction) 3.索引(index) 4.数据库的导出和备份 5.函数 6.防SQL注入 7.使用Explain分析SQL语句 8.视图(view) 1.ti ...
- Bzoj1018/洛谷P4246 [SHOI2008]堵塞的交通(线段树分治+并查集)
题面 Bzoj 洛谷 题解 考虑用并查集维护图的连通性,接着用线段树分治对每个修改进行分治. 具体来说,就是用一个时间轴表示图的状态,用线段树维护,对于一条边,我们判断如果他的存在时间正好在这个区间内 ...
- Category 特性在 iOS 组件化中的应用与管控
背景 iOS Category功能简介 Category 是 Objective-C 2.0之后添加的语言特性. Category 就是对装饰模式的一种具体实现.它的主要作用是在不改变原有类的前提下, ...
- 第二波分析:德国是2018世界杯夺冠最大热门? Python数据分析来揭开神秘面纱… (附源代码)
2018年,世界杯小组赛已经在如火如荼的进行中.在上篇文章的基础上[2018世界杯:用Python分析热门夺冠球队],我们继续分析世界杯32强的实力情况,以期能够更进一步分析本次世界杯的夺冠热门球队. ...
- OptParse选项工具模块
OptParse是一个从Python2.3版本起引入的一个编写命令行工具模块,示例如下 ######example.py###### import optparse if __name__ == &q ...
- python 并集union, 交集intersection, 差集difference, 对称差集symmetric_difference
python的集合set和其他语言类似,是一个无序不重复元素集, 可用于消除重复元素. 支持union(联合), intersection(交), difference(差)和sysmmetric d ...
- SDOI 2017 Round2 滚粗了
没进省队qwq 技不如人,甘拜下风
- 概率论与数理统计基础<1>:随机事件与随机变量
Part1. 随机事件 1-1.随机试验 随机试验:可以在相同条件下重复进行,每次试验的结果不止一个,事先知道所有可能的结果但不确定是哪一个的试验. 举例:重复的抛出一枚均匀的硬币就是一个随机试验,事 ...
- [BZOJ3507][CQOI2014]通配符匹配(DP+Hash)
显然f[i][j]表示S匹配到第i个通配符,T匹配到第j个字符,是否可行. 一次一起转移两个通配符之间的所有字符,Hash判断. 稍微有点细节.常数极大卡时过排名倒数,可能是没自然溢出的原因. #in ...
- 监控 Linux 系统的 7 个命令行工具
监控 Linux 系统的 7 个命令行工具: " 深入 关于Linux最棒的一件事之一是你能深入操作系统,来探索它是如何工作的,并寻找机会来微调性能或诊断问题.这里有一些基本的命令行工具,让 ...