- 当你使用 new、alloc 或 copy 创建对象时,对象的 count retain 到 1。你一定要负责把这个对象 release 或 autolease 掉。这样当它的生命周期结束时,它才能清空。
When you create an object using new, alloc, or copy, the object has a retain count of 1. You are responsible for sending the object a release or autorelease message when you’re done with it. That way, it gets cleaned up when its useful life is over.
- 当你使用其他方法获得一个对象时,你可以认为它已经 retain 了一个 count,并且 autolease 掉了。你不用考虑和它相关的清理问题。但是如果你想保留这个对象,那么你需要 retain 它,并且要确保之后你 release 了这个对象。
When you get hold of an object via any other mechanism, assume it has a retain count of 1 and that it has already been autoreleased. You don’t need to do any fur- ther work to make sure it gets cleaned up. If you’re going to hang on to the object for any
length of time, retain it and make sure to release it when you’re done.
- 如果你 retain 一个对象,你最终总是需要 release 或者 autolease 它。
If you retain an object, you need to (eventually) release or autorelease it. Balance these retains and releases.
这三条规则在写代码的时候一定要遵守,一旦遵守了一般也就不会有内存泄露的问题。
创建对象
Objective-C 中创建对象分为 alloc 和 init 两步,alloc 是在堆(heap)上初始化内存给对象变量,把变量(指针)设为 nil。每个类可以很多 init 方法,且每个方法都以 init 开头,但每个类只有一个特定(designated)的 init 方法,NSObject 是 init;,UIView 是 - (id)initWithFrame:(CGRect)aRect;。在子类的 designated 方法中一定要调用父类的 designated 方法,子类其他的
init 方法只能调用子类自己的 designated 方法,不能调用父类的(即使用 self 而不是 super)。
下面是一些小知识点:
- 当你想暂时保留对象时,使用 autolease
- (Money *)showMeTheMoney:(double)amount {
Money *theMoney = [[Money alloc] init:amount];
[theMoney autorelease];
return theMoney;
}
- 集合类的 autolease,一种方法是像对象一样调用 autolease,另外也可以调用 [NSMutableArray array],最好的方式 return [NSArray arrayWithObjects:@“Steve”, @“Ankush”, @“Sean”, nil];,其他类似的方法返回的对象都是 autolease 的对象。
[NSString stringWithFormat:@“Meaning of %@ is %d”, @“life”, 42];
[NSDictionary dictionaryWithObjectsAndKeys:ankush, @“TA”, janestudent, @“Student”, nil];
[NSArray arrayWithContentsOfFile:(NSString *)path];
- 集合类对新增的对象拥有 ownership
- @"string" 是 autorelease 的
- NSString 一般是 copye 而不是 retain
- 你应该尽快 release 你拥有的对象,越快越好。建议创建完对象后就写好 release 的代码
- 当最后一个对象 owner release 后,会自动调用 dealloc 函数,在类中需要重载 dealloc,但永远都不要自己去调用 dealloc
- @property 一般直接返回对象变量,我们可以把它理解为返回的是 autolease 的对象
- 使用 @synthesize 实现时,@property 可以指定 setter 函数使用 retain,copy 或 assign。assign 一般用在属性一定会随着对象的消亡而消亡的,比如 controller 的view,view 的 delegate
- Protocols 可以理解为抽象接口,delegat 和 dataSource 基本都是用 protocol 定义的
1. 通过分配或复制创建的对象保持计数1
2. 假设任何别的方法获取的对象保持计数1,而且在自动释放池中. 要想在当前执行范围外使用该对象,就必须保持它
3. 向集合添加对象时它就被保持,从集合移除对象时就被释放.释放集合对象会释放该集合中的所有对象
4. 确保有多少alloc,copy,mutableCopy或retain消息就有多少release或autorelease消息发送给该对象. 换句话说,确保你的代码平衡
5. 在访问方法设置属性,先保持,再释放 (ztime: 现在有@propperty , @synthesize 两个指令自动创建此代码)
6. 用@"..."结构创建的NSString对象是常量.发送release或retain并无效果
分享到:
相关推荐
FBMemoryProfiler是Facebook开源的一款用于分析iOS内存使用和检测循环引用的工具库。手机设备的内存是一个共享资源。应用程序可能会不当的耗尽内存、崩溃,或者遭遇大幅度的性能降低。当分配了一块内存,并设置了...
IOS 不规则按钮实现方法 直接引用即可
OOMDetector是一个iOS内存监控组件,应用此组件可以帮助你轻松实现OOM监控、大内存分配监控、内存泄漏检测等功能。 特性 1.OOM监控:监控OOM,Dump引起爆内存的堆栈 2.大内存分配监控:监控单次大块内存分配,提供...
iOS 绘制不规则图形,并且添加点击事件
庄延军《iOS内存管理及优化》,一本不错的关于ios内存管理的书。
IOS 内存管理 详细讲解iOS内存管理,对于深入研究内存管理的同学必须下载啊!
用于检测iOS内存泄漏,当每个页面结束时,能显瘦该页面的内存泄漏情况。这是一个很好的开发小工具
iOS性能优化
1.ios系统当前内存显示 2.label显示当前内存
ios移动开发的内存管理ppt,讲的不错,你值得拥有
iOS开发学习笔记之内存分配图示.虚拟内存分配图示
IOS内存管理与软件调试,本文档介绍了iOS内存管理和软件调试方法,如何找到crash的原因,文档为英文的,不喜欢的请勿下载。
使用运行时机制可以对任意一个NSObject对象及其子类 在任何类中添加 dealloc监测 在开发过程中可以检测循环引用等内存泄漏问题 方便自测 提高代码健壮性
深入理解IOS内存模型 Understanding iOS Memory
通过对不同类型的对象进行retain和copy进行深浅拷贝详细测试分析
为博客提供的内存泄漏调试的工程,更多的信息要见我的博客
iOS内存暴增问题追查与使用陷阱,非常详细的描述内存问题的调试方法
ios下,iphone,ipad,通过图片,实现的各种不规则形状的按钮例子.
ios加载图片内存暴涨解决方法,第一中UIKit-setImage,第二种苹果官方demo提供的分片比例裁剪方式,第三种CATiledLayer 详见Demo
iOS 绘制不规则图形,并且添加点击事件 的两种方法