gpt4 book ai didi

objective-c - 类方法,其中 self 如果在 block 中使用

转载 作者:太空狗 更新时间:2023-10-30 03:36:28 25 4
gpt4 key购买 nike

我有一个使用 dispatch_once 来创建静态对象的类方法。在 dispatch_once block 中,我使用 [self class] 并且想知道我是否需要使用对 self 的弱引用来避免保留周期?

+ (NSArray *)accountNames{
static NSArray *names = nil;
static dispatch_once_t predicate;
dispatch_once(&predicate, ^{
names = [[[self class] accounts] allKeys];
names = [names sortedArrayUsingSelector:@selector(caseInsensitiveCompare:)];
});
return names;
}

如果我对 self 使用弱引用,我会收到警告:

+ (NSArray *)accountNames{
static NSArray *names = nil;
static dispatch_once_t predicate;
__weak TUAccount *wself = self;
dispatch_once(&predicate, ^{
names = [[[wself class] accounts] allKeys];
names = [names sortedArrayUsingSelector:@selector(caseInsensitiveCompare:)];
});
return names;
}

使用“const Class”类型的表达式初始化“TUAccount *__weak”的不兼容指针类型

因为我收到警告,所以我认为在这种情况下我不需要使用对 self 的弱引用,但我想看看你们是怎么想的。

最佳答案

这里没有理由担心保留周期,因为保留或释放一个类对象是没有意义的——保留和释放根本没有效果。

您尝试进行弱引用是错误的,因为您正在使用类对象 self并尝试将其转换为 TUAccount实例 .两者是完全不同的东西。

此外,您还可以简化:

names = [[[self class] accounts] allKeys];

因为 self 已经是一个类,[self class] == self,所以这样做:

names = [[self accounts] allKeys];

关于objective-c - 类方法,其中 self 如果在 block 中使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10892287/

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