gpt4 book ai didi

objective-c - @properties 的显式 getter/setter (MRC)

转载 作者:太空狗 更新时间:2023-10-30 03:40:14 27 4
gpt4 key购买 nike

我是在 2012 年年中开始使用 Objective-C 语言编程的,当时 ARC 取代了 MRC 作为一种通用实践,使得后者几乎没有必要学习。

现在我正在尝试了解 MRC 的一些基础知识,以加深我对 Objective-C 中内存管理的了解。

我现在感兴趣的是如何手动为声明的 @properties 编写 getters/setters

到目前为止,我找到的唯一正常示例来自 Apple 的“高级内存管理编程指南”:

@interface Counter : NSObject {
NSNumber *_count;
}
@property (nonatomic, retain) NSNumber *count;
@end;

- (NSNumber *)count {
return _count;
}

- (void)setCount:(NSNumber *)newCount {
[newCount retain];

[_count release];

_count = newCount;
}

我的猜测是,要为 (nonatomic, copy) 做同样的事情,我应该这样写:

- (NSNumber *)count {
return _count;
}

- (void)setCount:(NSNumber *)newCount {
[_count release];

_count = [newCount copy];
}

所以问题是关于我不确定的其余组合:

如果有人可以向我展示在使用手动引用计数 (MRC) 的情况下应如何为以下 @property 声明编写显式 getter/setter 的示例,我将不胜感激:

1. @property (nonatomic, retain) NSNumber *count;
2. @property (nonatomic, copy) NSNumber *count;
3. @property (atomic, retain) NSNumber *count;
4. @property (assign) NSNumber *count;
5. What else is used often under MRC? (please share, if any other combinations exist)

最佳答案

1。 @property (nonatomic, retain) NSNumber *count;

    - (NSNumber *)count {
return _count;
}

- (void)setCount:(NSNumber *)count {
if (count != _count) {
NSNumber *oldCount = _count;
// retain before releasing the old one, in order to avoid other threads to
// ever accessing a released object through the `_count` pointer.
_count = [count retain];
// safely release the old one.
[_oldCount release];
}
}

2。 @property (nonatomic, copy) NSNumber *count;

    - (NSNumber *)count {
return _count;
}

- (void)setCount:(NSNumber *)count {
NSNumber *oldCount = _count;
_count = [count copy];
[_oldCount release];
}

3。 @property (atomic, retain) NSNumber *count;

    - (NSNumber *)count {
@synchronized(self) {
NSNumber *tmpCount = [_count retain];
}
return [tmpCount autorelease];
}

- (void)setCount:(NSNumber *)count {

@synchronized(self) {
if (count != _count) {
[_count release];
_count = [count retain];
}
}
}

注意:Objective-C 2.0 规范提到在内部使用锁,但并未具体说明如何使用。您在上面看到的大致是原子 getter/setter 的样子,但它可能不准确。

如您所见here , getter 中的 retain/autorelease 舞蹈是为了防止另一个线程中的 setter 在我们返回之前释放该值。

4。 @property (assign) NSNumber *count;

    - (NSNumber *)count {
@synchronized(self) {
NSNumber *tmpCount = _count;
}
return tmpCount;
}

- (void)setCount:(NSNumber *)count {
@synchronized(self) {
_count = count;
}
}

注意:atomic 是默认值。

其他可能的属性修饰符是readwrite/readonly,但它们只会产生合成效果或不产生 setter 效果。

关于objective-c - @properties 的显式 getter/setter (MRC),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21802069/

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