繁体   English   中英

__弱的通用变量声明块

[英]__weak general variables declaration for blocks

我目前正在研究使用许多块的实现。 每个障碍都需要与自我沟通。

目前,我正在这样做:

@implementation Foo
- (void) bar
{
    __weak Foo *weakSelf = self;
    [self doBlockStuff:^(id something) {
        [weakSelf doSomething];
    }];
}
@end

我有许多功能与弱实例化相同。

在接口块中实例化弱属性一次并在各处使用它是否正确?

它正在工作,但是被接受吗?

@interface Foo ()
{
    __weak Foo *_weakSelf;  
}
@end

@implementation Foo
-(instancetype) init
{
    self = [super init];
    if(self) {
        _weakSelf = self;
    }
    return self;
}

- (void) bar1
{
    [self doBlockStuff:^(id something) {
        [_weakSelf doSomething];
    }];
}
- (void) bar2
{
    [self doBlockStuff:^(id something) {
        [_weakSelf doSomething];
    }];
}
- (void) bar3
{
    [self doBlockStuff:^(id something) {
        [_weakSelf doSomething];
    }];
}
- (void) bar4
{
    [self doBlockStuff:^(id something) {
        [_weakSelf doSomething];
    }];
}
@end

使用新信息进行测试后进行编辑:我确实编写了一个小测试用例,现在我可以演示为什么第二个无法使用。 在我的Testclass中,在5秒后使用相关的自用信息发出了一个调度,当我调用dealloc时我记录了日志。

@implementation Foo

- (void)dealloc
{
    NSLog(@"dealloc");
}

- (instancetype)init
{
    self = [super init];
    if (self) {

    }

    return;
}

- (void)bar
{

    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(5 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
        [self doSomething];
    });
}

@end

如果该类丢失了所有者,因为控制器已关闭或其他原因并且该函数仍在运行,则在分派完成后,该类将进行对话。

@interface Foo ()
{
    __weak Foo *_weakSelf;  
}
@end

@implementation Foo

- (void)dealloc
{
    NSLog(@"dealloc");
}

- (instancetype)init
{
    self = [super init];
    if (self) {
        _weakSelf = self;
    }

    return;
}

- (void)bar
{

    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(5 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
        [_weakSelf doSomething];
    });
}

@end

如果完成了分配,则这也会在dealloc上进行。 由于_weakSelf属性仍在类中钻研,因此是使用self-> _ weak的简写。 自我意味着自我:)

@implementation Foo

- (void)dealloc
{
    NSLog(@"dealloc");
}

- (instancetype)init
{
    self = [super init];
    if (self) {

    }

    return;
}

- (void)bar
{
     __weak typeof(self) weakSelf = self;
    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(5 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
        [weakSelf doSomething];
    });
}

@end

由于弱引用仅存在于分配给该块的该函数中,因此该函数将立即取消分配。 该函数已结束,如果该类丢失了其引用,则该块将不具有阻碍任何人的属性。 但是,当引用类可用时,弱属性仍然可用。 可以肯定的是,该弱属性将仍然存在,我们可以在该块中设置一个强周期。

这根本不符合您的想法。 这些方法中的__weak实例变量? 那只是self->_weak的简写。 使用建议的方式的所有这些方法仍然可以很强地self捕捉。

坚持以前的做法。

如果__weakSelf仍然拥有很强的引用,那么这真的很糟糕。 问题是,如果在该方法中实例化并在该方法中使用它,它对自身的锚定是否仍然很弱,或者在那一刻它是否拥有强大的参照力。 根据文档,您可以在块外实例化一个弱引用,如果需要,甚至可以在块内实例化一个弱引用。 在这里看看

http://aceontech.com/objc/ios/2014/01/10/weakify-a-more-elegant-solution-to-weakself.html

我此时的问题是,为什么当真实的self进行dealloc时,弱的self实例化将其self进行dealloc。 因为我试图将弱的自身保留在另一个viewController中,然后取消分配实际的自我。 但是,一旦我解除了真实自我的分配,弱者就被解除了分配。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM