Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/117.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios __块的弱一般变量声明_Ios_Objective C_Iphone_Automatic Ref Counting - Fatal编程技术网

Ios __块的弱一般变量声明

Ios __块的弱一般变量声明,ios,objective-c,iphone,automatic-ref-counting,Ios,Objective C,Iphone,Automatic Ref Counting,我目前正在开发一个使用了许多块的实现。每个街区都需要与自己沟通 目前我正在这样做: @implementation Foo - (void) bar { __weak Foo *weakSelf = self; [self doBlockStuff:^(id something) { [weakSelf doSomething]; }]; } @end 我有许多函数可以对弱实例化执行相同的操作 在接口块中实例化弱属性一次并在任何地方使用它是否正确 这是可

我目前正在开发一个使用了许多块的实现。每个街区都需要与自己沟通

目前我正在这样做:

@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 a中,我在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->u weak的简写。自我意味着自我:)

这个函数将立即解除锁定,因为弱引用仅存在于给定给块的函数中。函数结束了,如果类失去了引用,那么块就没有任何属性可以打孔任何人。但是当引用类可用时,弱属性仍然可用。
可以肯定的是,这个弱属性将是活动的,我们可以在块中设置一个强循环。

这根本不像你想象的那样。那些方法中的
\u弱
实例变量?这只是
self->\u-weak
的简写。所有使用所提议方式的方法仍然强烈地捕获
自我


坚持你以前做过的事情。

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


我现在的问题是,为什么一个弱的自实例化的dealloc是self,而真正的self是dealloc。。?因为我试图在另一个viewController中保持弱自我,然后释放真实自我。但是,当我解开真正的自我时,软弱的自我就被解开了。

我想没关系。但是,您是否遇到任何错误或崩溃?没有,这是双向的。但我不知道这是否有泄漏。weakSelf属性与self属性的引用相同吗?因此,如果我以后更改self中的属性,这也会影响接口中的weakSelf属性?它不会带来泄漏__弱变量不能保持自我。不过,我还是建议你再通读一遍。强烈地捕捉自己本身并不是一件坏事,事实上,它通常非常有用。了解使用
\u弱
引用实际上是有保证的。我认为第二种解决方案也是有保证的。我不知道在这种声明中它有多强,但当我想到一个弱的属性时,我也会叫self.weakSelf。。。哈哈,真有趣。为了找到答案,我将看一下文档。如果代码没有给出严重的编译器警告(正是因为您给出的原因,因为它是对self的隐藏引用),那么OP迫切需要在Xcode中打开一些警告。如果在块中使用self,那么Xcode也不会显示警告。也许我忽略了使用弱电的真正意义。在我看来,这是为了确保块没有对主类的强引用,这意味着可以解除分配我的主类,并且可能仍然处于活动状态的块不会阻止此解除分配,因为它没有对类的强引用。将实例变量设置为“弱”也将使类在使用此属性的块运行时完全解除锁定。还是果酱错了?
@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