Maison  >  Questions et réponses  >  le corps du texte

ios - 为什么block 里面使用self,instruments leaks 没有检测出内存泄漏?需要用什么方法才能检测出

① 为什么block 里面使用self,instruments leaks 没有检测出内存泄漏?
② 那么需要用什么方法才能检测出这里是出现了内存泄漏,因为一直都是网上这么说的,自己检测就不出来了。

下面事例代码:


#import "ViewController.h"

typedef void(^myBlock)(NSString *);

@interface ViewController ()

@property(nonatomic, copy) myBlock BlockName;

@property (nonatomic, copy) NSString  *name1;
@property (nonatomic, copy) NSString  *name2;
@property (nonatomic, strong) NSMutableArray  *students;


@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];

    /// 问:为什么instruments leaks 没有检测出内存泄漏?
    /// 那么需要用什么方法才能检测出这里是出现了内存泄漏,因为一直都是网上这么说的,自己检测就不出来了。
    self.BlockName = ^(NSString *ken){
        self.name1 = ken;
        self.name2 = ken;
        [self.students addObject:self.name1];
        [self.students addObject:self.name2];
    };
    
    self.BlockName(@"apple");
}

@end
PHP中文网PHP中文网2741 Il y a quelques jours607

répondre à tous(2)je répondrai

  • 大家讲道理

    大家讲道理2017-04-18 09:46:06

    L'utilisation de self in block est en fait une référence circulaire, c'est-à-dire qu'il existe une forte référence entre les deux objets par rapport à la situation ARC. Bien qu'aucun d'eux ne libère de la mémoire, ils sont tous deux référencés. Actuellement, lorsque vous utilisez le débogage d'exécution dans Xcode 8, vous pouvez voir le diagramme de relations de mémoire et vous pouvez trouver les deux objets référencés de manière circulaire via le diagramme de relations.

    répondre
    0
  • 黄舟

    黄舟2017-04-18 09:46:06

    __weak __typeof(self) weakSelf=self;
        dispatch_time_t time = dispatch_time(DISPATCH_TIME_NOW, 6ull * NSEC_PER_SEC);
        NSLog(@"waited at least 6s.");
        dispatch_after(time, dispatch_get_main_queue(), ^{
            __strong __typeof(weakSelf) strongSelf=weakSelf;
            if (strongSelf) {
                NSLog(@"Oh,shit. self is not nil");
            }else
            {
                NSLog(@"Congratulations");
            }
    
        });
        
    将上段代码放在viewDidLoad里面即可。push这个vc,6秒内pop掉,等待log。
    
    

    répondre
    0
  • Annulerrépondre