iOS开发,内存管理问题

Objective-C 的内存管理方法,分为3种

<br />

MRC(Manual Reference Counting, 手动引用计数)
ARC(Automatic Reference Counting, 手动引用计数)
GC (Garbage Collector, 垃圾回收机制)

<br />
MRC:就是由程序员自己负责管理对象生命周期,负责对象的创建和销毁。
<br />
ARC:采用与MRC一样的内存引用计数管理方法,但不同的是,它在编译时会在合适的位置插入对象内存释放(如release、autorelease和retain等),程序员不用关心对象释放的问题。苹果推荐在项目中使用ARC。ARC不能在iOS5之前的系统中使用。
<br />
GC:在OC2.0之后,内存管理出现了类似于JAVA和C#的内存垃圾收集技术,但与ARC完全不同,GC是后台有一个线程负责监察已经不再使用的对象,然后将它释放。由于后台一直有一个线程在运行,因此会严重影响性能,这也是Android(安卓)手机一直让人不爽的原因。重点!CG技术不能应用于iOS开发,只能应用于Mac OS X 开发。
<br />

由上可知:iOS采用ARC和MRC这两种方式,ARC是苹果推荐的方式,MRC相对比较原始,对于程序员的能力要求很高,但是它很灵活、方便,很不容易驾驭。另外,Swift采用ARC管理内存。

<br />
1)与retain配对使用的方法是release,因为retain是将内存的引用计数加一(对对象进行一次持有),release是将内存的引用计数减一(结束对对象的持有)。

2)与alloc对应的方法是dealloc,因为alloc表示开辟内存空间,创建对象,dealloc表示回收内存空间,释放对象。

3)readwrite表示读写设置中的可读可写(读写设置的默认值),编译器会为读写设置声明为”readwrite”的属性自动合成setter和getter方法。

4)readonly表示读写设置中的只读,编译器会为读写设置声明为”readonly“的属性自动合成”getter”方法,而不合成”setter“方法。

5)assign是语义设置(语义设置的默认值),使用assign修饰的属性所对应的读写方法中不会操作内存的引用计数,所以一般将不需要程序员管理的数据类型声明为assign,如基本数据类型和结构体类型。

6)retain是语义设置,使用retain修饰的属性所对应的读写方法中会对内存的引用计数进行操作,以保证持有的对象不会被意外回收,OC中的对象使用retain修饰。

7)copy是语义设置,使用copy修饰的属性所对应的读写方法中会将将要持有的对象拷贝一份,并持有对象的副本而不是原对象。对于OC中的可变对象,使用copy修饰,是”深拷贝“,在内存中生成一块新的内存空间,将原对象拷贝到新空间中;对于OC中的不可变对象,使用copy修饰,是”浅拷贝“,只拷贝对象的内存地址。

8)atomic:是原子特性(原子设置的默认值),在多线程环境下,使用atomic会保证在同一时刻只有一条线程修改、访问对应的实例变量,保证了实例变量在多线程环境下的安全性,但是比较耗费资源,所以只有对于需要线程安全的属性才使用atomic来修饰。

9)nonatomic:是原子特性,在多线程环境下不能保证线程安全,这种设置不会消耗过多的资源,所以不需要保证多线程环境中线程安全的属性,声明为nonatomic。

10)strong:ARC中的语义设置,相当于MRC中的retain,会操作内存的引用计数。

11)week:ARC中的语义设置,相当于MRC中的assign,不仅不会操作内存的引用计数,而且在对象被回收后,会将指针置为nil,防止”野指针“的出现。
<br />

autorelease的使用问题

<br />
在MRC中,释放对象通过release或autorelease消息实现,其中release消息会立刻使引用计数减一,autorelease消息会使对象放入内存释放池中延迟释放,对象的引用计数并不变化,而是向内存释放池中添加一条记录,直到池被销毁前通知池中的所有对象全部发送release消息才真正将引用计数减少。
<br />
由于使用autorelease消息会使对象延迟释放,所以除非必须的情况,否则不要使用它释放对象。在iOS程序中,内存释放池的释放默认在程序结束。
<br />
我们可以在应用程序的主入口 main.m 中看到这段代码:

        int main(int argc, char * argv[]) {
    @autoreleasepool {
        return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
    }
  }

在@autoreleasepool{...}之间的代码,就是池的作用范围,默认是整个应用。如果产生大量对象,采用autorelease释放也会导致内存泄漏。
<br />
什么时候使用autorelease呢?请看下面的代码:

        - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
    
    static NSString *CellIdentifier = @"CellIdentifier";
    
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    
    if (!cell) {
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier: CellIdentifier] autorelease];
    }
    return cell;
}

在上面的代码中,cell对象不能马上释放,我们需要使用它设置表示图的界面。autorelease一般用在为其他调用者提供对象的方法中,对象在该方法中不能马上释放,所以需要延迟释放。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,324评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,303评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,192评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,555评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,569评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,566评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,927评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,583评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,827评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,590评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,669评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,365评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,941评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,928评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,159评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,880评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,399评论 2 342

推荐阅读更多精彩内容

  • 内存管理 简述OC中内存管理机制。与retain配对使用的方法是dealloc还是release,为什么?需要与a...
    丶逐渐阅读 1,946评论 1 16
  • 29.理解引用计数 Objective-C语言使用引用计数来管理内存,也就是说,每个对象都有个可以递增或递减的计数...
    Code_Ninja阅读 1,468评论 1 3
  • iOS内存管理 概述 什么是内存管理 应用程序内存管理是在程序运行时分配内存(比如创建一个对象,会增加内存占用)与...
    蚊香酱阅读 5,691评论 8 119
  • 内存管理 ARC处理原理 ARC是Objective-C编译器的特性,而不是运行时特性或者垃圾回收机制,ARC所做...
    b485c88ab697阅读 11,180评论 3 47
  • 当你娘都觉得你胖了的时候你就真的应该减肥了。还好在我爹眼里我依然貌美如花。 今天是晨练的第一天。 早晨六点钟天已经...
    悬崖边上的金鱼公主阅读 286评论 0 0