gpt4 book ai didi

ios - `nonatomic` 在 `readonly` 声明的属性(包括类属性)中是否有意义?

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

编辑:这个问题也适用于普通声明的属性(不仅适用于类属性)!

原帖:

假设我有一个公共(public)类方法 sharedInstance,它目前是作为一个 getter 方法实现的:

@interface MyClass

+ (instancetype)sharedInstance;

- (void)doSomething;

@end

@implementation MyClass

+ (instancetype)sharedInstance {
static MyClass *shared = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
shared = [[MyClass alloc] init];
});
return shared;
}

@end

在 Swift 3.0 中访问此方法如下所示:MyClass.shared().doSomething()

因此,为了使其更敏捷,我们应该将类方法更改为类属性(Xcode 8 中的新功能。但实际上我无法在 Apple Docu 中找到它,只能在 WWDC 2016 视频中找到)

@interface MyClass

@property (class, nonatomic, readonly) MyClass *sharedInstance;

- (void)doSomething;

@end

// implementation stays the same

现在在 Swift 代码中:MyClass.shared.doSomething()

nonatomic/atomic 属性修饰符(不知道确切的术语)对于我自己在 objc 中实现的 getter 方法是否有意义?

最佳答案

由于多种原因,atomic/nonatomic 修饰符对您的情况无效。

主要原因是原子性关键字只影响生成的代码(即合成访问器方法)。当您在接口(interface)中声明一个 @property,然后在您的实现中使用一个方法(或方法对)实现它时,编译器不会生成代码,因此您的原子性关键字将被忽略。

有几种方法可以解决这种情况,而您正在触发其中的几种方法:

  • 首先,您有一个 class 属性。编译器无法为类属性合成访问器或存储——这意味着没有代码生成,因此原子性不适用。

  • 其次,在 readonly 属性的最常见用途中,@property 声明由手动实现的 getter 方法支持——这意味着没有代码生成,并且因此原子性不适用。

    (请注意,您还可以在公共(public)接口(interface)中将实例属性声明为 readonly,并在您的实现中由于私有(private) readwrite 重新声明而合成。在这种情况下,不仅原子性适用,您还必须使原子性关键字在您的公共(public)声明和私有(private)声明之间匹配。您也可以仅合成一个 getter 并在您的实现中直接使用支持 ivar。)

因为为此属性指定 atomicnonatomic 都不起作用,所以您可以自由地将 atomicity 关键字完全排除在声明之外。 (编译器将假定 atomic,但如前所述,该假定无效。)

关于ios - `nonatomic` 在 `readonly` 声明的属性(包括类属性)中是否有意义?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40472101/

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