ios 编程日记 :内存问题汇总
来源:互联网 发布:全栈工程师知乎 编辑:程序博客网 时间:2024/06/03 20:16
(1)UIView本身占用的内存并不是很大,但是使用这个方法(tempImage过大会占用很高的内存)
setBackgroundColor:[UIColor colorWithPatternImage:tempImage],这个怎么解决呢?推荐使用UIImageView,然后再setImage这个方法,这样内存基本不会增长
(2)任何一个UIView如果没有被remove掉,即使它被release掉了,依然占用着大量内存.UIView需要remove,数组需要清空;对于一个拥有大量subView的UIView,要最好使用一个for循环来执remove操作for(UIView * temp in [myview subviews]) {temp removeFromSuperview}
(3)隐藏内存泄漏,比如一个UIView,fatherView,上面有许多的子视图(subviews),如果有释放内存的时候仅仅释放fatherView的内存(对其执行remove,release操作),那么此处必定内存无法回收。即使你的subviews已经release了,retainCount=0,但是并没有remove,所以这也是内存泄漏。
(4)下面说说alloc、retain、copy,见到这三个不用说必须release。alloc和retain都会造成计数器+1
ClassA *obj1 = [[ClassA alloc] init];// obj1的计数器加1
ClassA *obj2=obj1; // obj1的计数器再次加1为2
[obj2 retain]; // 这样写计数器加1为1
[obj1 release]; // obj1的计数器减1为0
[obj2 release]; // 这里也可以写成[obj1 release] ,基于谁retain谁释放原则最好不这么写
----------------------------
说下copy深拷贝和retain浅拷贝的区别
ClassA *obj1 = [[ClassA alloc] init]; // obj1计数器j加1
ClassA *obj2 = [obj1 copy] // obj1计数器不加1,obj2计数器加1
[obj1 release] // obj2计数器为0,释放时必须这样写了
[obj2 release] // obj1计数器为0
如上,这里注意释放对象及释放顺序
(5)关于属性声明,首先说说@property
@property:你可以理解为系统给你写了get/set方法
-(NSString*) name{ return _name;}-(void) setName:(NSString *)name{ if (_name != name) { [_name release]; _name = [name retain];//这行就是下面解释的属性中你定义的属性起到的作用 }}
readonly属性: 只能读,不能写;
assign属性: 是默认属性,直接赋值,没有任何保留与释放问题;
retain属性: 会增加原有对象的引用计数并且在赋值前会释放原有对象,然后在进行赋值;
copy属性: 会复制原有对象,并在赋值前释放原有对象,然后在进行赋值;
atomic、assign、readwrite这三种属性是默认的,可不写,基本上所有@property都是noatomic的,也就是非线程安全的
除了基本类型和delegate用assign,其他都用retain,有因为assign是默认属性,所以类似
@property(atomic,assign) int i;可以直接写成
@property int i;
说道属性顺便说下self.属性 = 值,self set属性 = 值,属性 = 值,这三种赋值的区别
第一种和第二种方式都会造成计数器加1,需要release掉,而第三种直接赋值给属性可以称为弱引用没有计数器加1。如果释放掉后会造成n内存释放过度。
(6)[(UIButton *)[self.view viewWithTag:123] removeFromSuperview]和[[self.view viewWithTag:123] removeFromSuperview]效果是不一样的,通过tag取出来的对象需要类型转换才能正确移除掉;
(7)完全释放一个对象的参考代码:
m_text = nil;
- ios 编程日记 :内存问题汇总
- ios 编程日记 1 :内存问题
- ios 编程日记 1 :内存问题 补充
- [MyBatis日记]问题汇总
- iOS 图形编程汇总
- IOS开发问题汇总
- IOS开发问题汇总
- IOS 开发问题汇总
- ios奇怪问题汇总
- ios调试问题汇总
- ios开发问题汇总
- iOS开发问题汇总
- IOS-问题汇总
- iOS 打包问题汇总
- iOS面试问题汇总
- [转载] iOS问题汇总
- Windows编程问题汇总
- ios编程中遇到的内存漏泄问题的总结
- RHEL系统以FTP服务器搭建yum源
- RHEL系统安装Oracle 10g详解
- 给黑莓程序添加快捷键
- Oracle服务器体系之实例详解
- Oracle数据库网络配置详解
- ios 编程日记 :内存问题汇总
- Oracle 日志操作模式管理
- Eclipse调试多线程代码
- Oracle SQL*plus使用基础
- Fedora的启动方式(命令行启动)
- 一步步照着做,你也会用cocosbuilder
- 初识Webservice
- c# List Sort 简单实现
- Java RMI 编程实例