gpt4 book ai didi

objective-c - 使用 ARC 覆盖 setter 方法(strong 与 assign)

转载 作者:太空狗 更新时间:2023-10-30 04:02:05 24 4
gpt4 key购买 nike

在接口(interface)中定义 strong 属性时,如下所示:

@property (nonatomic, strong) UIColor *petColor;

不再需要添加@synthesize,或者@dynamic,或者手动定义内部ivar为_petColor,这一切只是工作。 setter/getter 是自动生成的,您可以在内部访问 _petColor,无需任何额外代码。

但是,我对如何(如果有的话)在覆盖 setter 时感到有点困惑,ARC 知道是否根据属性是否插入保留/释放调用 strong 还是 weak?例如,如果我有两个属性:

@property (nonatomic, strong) UIColor *petColor;
@property (nonatomic, weak) SomeClass *petDelegate;

如果我想覆盖这些属性的 setter ,它们似乎几乎完全相同?

- (void)setPetColor:(UIColor *)theColor {
if (![theColor isEqual:petColor]) {
_petColor = theColor;
}
}

- (void)setPetDelegate:(SomeClass *)theDel {
if (theDel != petDelegate) {
_petDelegate = theDel;
}
}

这是正确的吗?如果是这样,ARC 是在这两个 setter 中自动插入正确的 retain/release 调用,还是仅在 strong 属性的重写 setter 中插入正确的调用?

进一步weak 属性行为是否不同,在这种情况下,assign 属性行为?

最佳答案

它甚至比这更简单。合成时,实例变量获得各自的限定符:

@implementation MyClass {
// this is what is added by the auto synthesize
UIColor * __strong _petColor;
SomeClass * __weak _petDelegate;
}

因此,当您使用自己的 setter 分配给实例变量时,一切都很好,除了 copy 限定符。那个不能用于实例变量,所以再分配一个副本给实例变量。

关于对象属性的assign(或等效的unsafe_unretained),实例变量只是一个指针,并被合成为

    SomeClass * __unsafe_unretained _petDelegate;

因此,如果分配给该属性的对象被释放,指针将不会像 weak 那样设置为 nil,而是指向被释放对象之前所在的位置。这可能会导致崩溃。根据经验,如果您为 iOS 5 或更高版本编写代码,请始终在对象属性上使用 weak 而不是 assignunsafe_unretained

关于objective-c - 使用 ARC 覆盖 setter 方法(strong 与 assign),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18894514/

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