02ARC内存管理原则_Foundation和CoreFoundation_全局变量_属性关键字使用_ARC与MRC的混编_Block_循环引用_enumerate遍历_倒序遍历

一、ARC
(一)基本原理
项目:ARC0427
1.MRC:Manual Reference Counting 手动引用计数
手动添加retain、release、autorelease、super dealloc

2.ARC:Automatic Referenc Counting 自动引用计数
ARC内存管理原则:
1)有强引用指针指向的对象,不会被释放掉
2)若没有,就会被立刻释放。

3.关键字的使用
1)系统在编译时自动添加retain、release、autorelease、super dealloc
2)禁用retain、release、autorelease、super dealloc

使用新关键字strong、weak、unsafe_unretain(不常用)、__bridge
 (1) strong:强引用,会对对象引用计数+1。出了作用域,就会被释放。
 (2) weak,(不常用)unsafe_unretain:弱引用,对引用计数无+-。
   weak:立即被释放。当对象释放,指针会指向nil,不会造成程序崩溃
   unsafe_unretained(不常用):当对象释放,指针仍指向被释放对象的内存,程序会崩溃
 (3) __bridge:用于 对OC类型与CF类型 互相转换时的内存管理。

特点:
①在ARC中使用
②不会改变ownership(内存管理权限)
方法:CFBridgingRetain
特点:交换管理权限
注意:声明变量时,默认是strong

4.Foundation 和 CoreFoundation
1)概念
Foundation框架:定义了常用的数据类型(如OC对象 NSString、NSData、NSSet等)。
CoreFoundation框架:定义了与系统底层API打交道的数据类型(CF开头的类型)。
2)区别
OC类型 与 CF类型 在内存结构上是相同的,即同一块内存地址上有两个不同的名字(NS,CF
3)转换
ARC下,OC与CF 要使用关键字__bridge 进行转换
MRC下,OC与CF 可直接进行 强制类型转换

(二)
项目:ARC_More0427
1.__autoreleasing:不常用,系统会自动添加
2.@autoreleasepool{}:不常用,可以替换 MRC 中的 NSAutoreleasePool
在局部大量创建自动释放的对象时(如for循环),会使用自动释放池。
3.移除通知:自定义类的对象被注册为监听者时,当该对象被释放时,在该类的dealloc方法中移除通知
4.局部、实例、全局变量
1)局部变量:出了作用域就会被释放
2)实例变量:dealloc中释放
3)全局变量:程序退出时系统自动收回
在整个应用程序中都可以使用,程序退出时,才被释放。系统管理内存。

//①声明:
#import "AppDelegate.h"
NSString *text = @"全局变量";
//②引入:
#import "ViewController.h"
extern NSString *text;

5.属性关键字的使用
1)基本数据类型:assign(或省略)
2)字符串:copy
3)对象:strong(等同于MRC中的retain)
4)代理:weak(防止循环引用)
5)控件
①拖拽:默认为weak(也可以使用strong,但没有必要)
原因:self.view已经使用了strong关键字,所以没有必要对拖拽的控件使用strong,用weak即可。
②手动:strong

6.ARC与MRC的混编
1)ARC环境下:使用第三方类库(不支持ARC),在每个文件上加 -fno-objc-arc
2)MRC环境下:使用第三方类库(只支持ARC),在每个文件上加 -fobjc-arc
举例:
weak

    __weak UIView *view1 = [[UIView alloc]initWithFrame:CGRectZero];
    NSLog(@"1.view1 = %@",view1);//被立即释放
    {
        UIView *view2 = [[UIView alloc]initWithFrame:CGRectZero];//strong
        view1 = view2;//只要有一个strong,view1就不会释放
        NSLog(@"2.view1 = %@",view1);
    }//view2被释放,即view2 = nil;view1也为nil
    NSLog(@"3.view1 = %@",view1);

二、Block
(一)
项目:Block_Define0427
一、局部block对象 定义格式
1.声明

void(^blockName)(parameter list)

①无参无返回值
②有参无返回值
③有参有返回值

    float(^calculateBMI)(float,float);

2.实现

blockName = ^(parameter list){ myCode };
    calculateBMI = ^(float weight,float height)
    {
        float BMI = weight / (height *height);
        return BMI;
    };

3.调用

blockName(parameter list);
    float bmi = calculateBMI(70,1.7);

(二)block内部使用外部变量
项目:Block_UseOutPamater
1.局部变量
1)普通局部变量
相当于copy了一个新的变量,值和原来的一样,
block内只读,与外部的i是两个不同的变量

int i = 1;

2)使用__block关键字
block内可修改,与外部的i是同一变量

__block int block_i = 1;

2.实例变量和静态变量
block是从变量所在的内存地址中读取最新的值
可修改

(三)
项目:Block_MRC_Memory
1.MRC下的内存分配
1)不使用外部变量
NSGlobalBlock类型,分配在全局变量区,由系统收回
2)使用外部变量
NSStackBlock类型,分配到栈区
该block出了作用域,就由系统释放。
3)对分配在栈区的block进行Block_copy操作
NSMallocBlock类型,分配在堆区
程序员只要不调用Block_release(...)方法,block就始终存在
2.ARC下的内存分配
系统会对栈上的block进行一次copy,拷贝到堆区,由NSStackBlock--->NSMallocBlock
使用外部变量
NSMallocBlock类型
(四)
项目:Block_MRC_Memory

 UIView *view = [[UIView alloc]initWithFrame:CGRectZero];
    void(^block1)() = ^()
    {
        view.backgroundColor = [UIColor redColor];
    };
    Block_copy(block1);//copy方法只对栈区的block有用

使用Block_copy使block1变为堆区
分配在堆上的block会对外部变量的引用计数+1
当block释放时,它内部使用的外部变量的引用计数会随之-1

造成循环引用:
block释放时,self.retainCount会-1
self释放时,block才会释放(在self的dealloc方法中释放)

防止循环引用:
在MRC环境中,使用__block修饰外部变量
在ARC环境中,使用__weak修饰

(五)
项目:Block_TransformValue0427
1.遍历
1)遍历数组

    NSArray *array = @[@"1",@"2",@"3",@"4",@"5",@"6",@"7",@"8"];
    [array enumerateObjectsUsingBlock:^(id  _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
        NSLog(@"obj%d = %@",idx,obj);
        if (idx == 4)
        {
            *stop = YES;//停止循环
        }
    }];

2)倒序遍历

    [array enumerateObjectsWithOptions:NSEnumerationConcurrent usingBlock:^(id  _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
    }];

2.传值

测试:alertView传值,用block

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念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

推荐阅读更多精彩内容