[英]__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.