gpt4 book ai didi

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

转载 作者:qq735679552 更新时间:2022-09-27 22:32:09 26 4
gpt4 key购买 nike

CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.

这篇CFSDN的博客文章iOS MRC 下 block 循环引用问题实例讲解由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.

下面一段代码给大家介绍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 循环引用问题,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对我网站的支持! 。

原文链接:http://blog.csdn.net/jeffasd/article/details/78690342 。

最后此篇关于iOS MRC 下 block 循环引用问题实例讲解的文章就讲到这里了,如果你想了解更多关于iOS MRC 下 block 循环引用问题实例讲解的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com