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;

[m_text release]; 

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 公司工资保密同事要看工资条怎么办 考上特岗教师后和老公异地怎么办 档案在无档案保管权限的公司怎么办 辞职了户口迁回农原籍不接收怎么办 当正职直接指挥下级副职领导怎么办 单位申报个税身份证号码填错怎么办 申报个税身份证号码填错了怎么办 办了人事代理联系函商调函怎么办 劳务公司与分包工头算账成怎么办 客户退保业务员己得保险佣金怎么办 投了简历公司打来电话没接到怎么办 跟老板要工资她说过几天怎么办 公路车弯把手小抓不到刹车怎么办 新手骑电动车上路车子一直晃怎么办 不知情收赃东西已经卖了怎么办 档案和派遣证不在同一个地方怎么办 档案缺招工表和派遣证怎么办退休 开发商对接的银行利息比较高怎么办 工作未满一年离职转正定级怎么办 被网络骗贷翻到几十万怎么办 面试通过后迟迟不通知入职怎么办 厂里捡到饭卡花了里面的钱怎么办 上班用自己手机打卡没电怎么办 逸尚考勤机显示超出考勤记录怎么办 下雨穿套裙工装上班好冷怎么办 蚂蚁借呗放款中不到账怎么办 护士电子化注册没有激活码怎么办? 地铁站务员入职体检身高差点怎么办 车子钥匙锁在车里了怎么办 打错账户了怎么办5天了 下岗失业人员在就业后档案怎么办 皮秒祛斑后没有敷面膜怎么办 硕士毕业工资好低不想工作怎么办 车卖了etc忘拿了怎么办 成熟卵泡打破卵针也不破怎么办? 深圳孩子户口挂别人名下上学怎么办 襄阳东风合运花园房贷怎么办下来 猫在外面躲起来找不到了怎么办 本科三批取消以后三本学校怎么办 机票名字多了个字母安检怎么办 出隧道口限速40超速了怎么办