gpt4 book ai didi

objective-c - 可以为 block 中的自动合成属性使用下划线(强引用循环)

转载 作者:搜寻专家 更新时间:2023-10-30 20:00:02 25 4
gpt4 key购买 nike

假设我有这样的东西:

@interface Foo : UIViewController

@property (nonatomic, strong) NSString *name;

@end

@implementation Foo

- (void)viewDidLoad
{
[super viewDidLoad];
_name = @"Me";
NSArray *blackList = @[@"John", @"Malcolm", @"Jimmy"];
[blackList enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
if ([obj isEqualToString:_name]) // Is _name just as bad as using self.name?
{
NSLog(@"You're on the blacklist!");
*stop = YES;
}
}];
}

@end

问题在这一行:if ([obj isEqualToString:_name])

我知道在 block 中引用 self 是不好的,你可以通过使用 __weak Foo *weakSelf = self 来绕过它,然后在 block 中引用 weakSelf堵塞。

__weak Foo *weakSelf = self;
[blackList enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
if ([obj isEqualToString:weakSelf.name])
{
NSLog(@"You're on the blacklist!");
*stop = YES;
}
}];

但是,如果我们不显式地写 self.name,而是写 _name,这仍然很糟糕吗?

最佳答案

Is _name just as bad as using self.name?

是的,是的。事实上,self 引用仍然存在 - 编译器会为您插入它。

you can get around it by using __weak Foo *weakSelf = self and then refer to weakSelf in the block.

你可以在这里使用同样的技巧,引用weakSelf->_name

注意:没有必要将这个技巧与 enumerateObjectsUsingBlock: 一起使用,因为枚举完成并且 block 在您的方法范围内被释放。仅当您将 block 放在 self 对象的变量中,同时还从 block 中引用 self 时,才会发生保留循环的威胁。

关于objective-c - 可以为 block 中的自动合成属性使用下划线(强引用循环),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24479061/

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