iOS MRC 下 block 循环引用问题实例讲解

2025-05-29 0 61

下面一段代码给大家介绍iOS MRC 下 block 循环引用问题

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24
//注意此__block会复制一份指针出来 一次原始的指针如果置为nil的话,此处复制出来的指针还是野指针

__block __typeof(self)weakSelf = self;

//__weak __typeof(self)weakSelf = self;

//__weak Person *weakSelf = self;

void (^block)(void) = ^(void){

//NSLog(@"name --> is %@", self.name);

//NSLog(@"name --> is %@", weakSelf.name);

//这样判断会crash 此时weakSelf为野指针

//weakSelf 这时候是个野指针。。。野指针也是指针对吧?反正,这个野指针并不为NULL,虽然它指向的内存并未有什么鸟用,

//然而代码并不知道。所以 执行[weakSelf doSomething]; 必然闪退。

//注意此__block会复制一份指针出来 一次原始的指针如果置为nil的话,此处复制出来的指针还是野指针

// if (weakSelf) {

// NSLog(@"name --> is %@", weakSelf.name);

// }

//malloc(22);

// malloc_zon

//这并没有什么卵用。。。weakSelf 已经是野指针 照样crash

// __strong __typeof(weakSelf) strongSelf = weakSelf;

// if (weakSelf) {

// NSLog(@"name --> is %@", strongSelf.name);

// }

if (malloc_zone_from_ptr(weakSelf)) {

NSLog(@"name --> is %@", weakSelf.name);

}

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40
//

// ViewController.m

// test_mrc_block_self_01

//

// Created by jeffasd on 2017/12/1.

// Copyright © 2017年 jeffasd. All rights reserved.

//

#import "ViewController.h"

#import "Person.h"

@interface ViewController ()

@property (nonatomic, copy) NSString *name;

@end

@implementation ViewController

- (void)viewDidLoad {

[super viewDidLoad];

self.view.backgroundColor = [UIColor whiteColor];

self.name = @"xiaoming";

}

- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{

self.view.backgroundColor = [UIColor cyanColor];

// void (^block)(void) = ^(void){

// NSLog(@"name --> is %@", self.name);

// };

//

//

//

// for (int i = 0; i < 30; i++) {

// block();

// }

Person *xiaoming = [[Person alloc] init];

//[xiaoming retain];

[xiaoming release];

// xiaoming = nil;

xiaoming = NULL;

}

- (void)didReceiveMemoryWarning {

[super didReceiveMemoryWarning];

// Dispose of any resources that can be recreated.

}

@end

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53
//

// Person.m

// test_mrc_block_self_01

//

// Created by jeffasd on 2017/12/1.

// Copyright © 2017年 jeffasd. All rights reserved.

//

#import "Person.h"

#include <malloc/malloc.h>

@interface Person ()

@property (nonatomic, copy) NSString *name;

@end

@implementation Person

- (instancetype)init{

if (self = [super init]) {

self.name = @"xiaoming";

//注意此__block会复制一份指针出来 一次原始的指针如果置为nil的话,此处复制出来的指针还是野指针

__block __typeof(self)weakSelf = self;

//__weak __typeof(self)weakSelf = self;

//__weak Person *weakSelf = self;

void (^block)(void) = ^(void){

//NSLog(@"name --> is %@", self.name);

//NSLog(@"name --> is %@", weakSelf.name);

//这样判断会crash 此时weakSelf为野指针

//weakSelf 这时候是个野指针。。。野指针也是指针对吧?反正,这个野指针并不为NULL,虽然它指向的内存并未有什么鸟用,

//然而代码并不知道。所以 执行[weakSelf doSomething]; 必然闪退。

//注意此__block会复制一份指针出来 一次原始的指针如果置为nil的话,此处复制出来的指针还是野指针

// if (weakSelf) {

// NSLog(@"name --> is %@", weakSelf.name);

// }

//malloc(22);

// malloc_zon

//这并没有什么卵用。。。weakSelf 已经是野指针 照样crash

// __strong __typeof(weakSelf) strongSelf = weakSelf;

// if (weakSelf) {

// NSLog(@"name --> is %@", strongSelf.name);

// }

if (malloc_zone_from_ptr(weakSelf)) {

NSLog(@"name --> is %@", weakSelf.name);

}

};

for (int i = 0; i < 300; i++) {

// dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{

// block();

// });

dispatch_async(dispatch_get_main_queue(), ^{

block();

});

}

}

return self;

}

@end

总结

以上所述是小编给大家介绍的iOS MRC 下 block 循环引用问题,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对快网idc网站的支持!

收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。

快网idc优惠网 建站教程 iOS MRC 下 block 循环引用问题实例讲解 https://www.kuaiidc.com/90071.html

相关文章

发表评论
暂无评论