gpt4 book ai didi

ios - 使用 ARC 在 iOS 5+ 中延迟加载属性

转载 作者:可可西里 更新时间:2023-11-01 03:36:24 25 4
gpt4 key购买 nike

问题

我正在迁移一些遗留代码(iOS 5 之前),我在其中延迟加载一些 readonly 属性。我想使用 ARC 将此代码更新到 iOS 5+。但我刚刚了解 ARC。

.h

@property (nonatomic, retain, readonly) NSDateFormatter *timeFormatter;

.m

- (NSDateFormatter *)timeFormatter {
if (timeFormatter == nil) {
timeFormatter = [[NSDateFormatter alloc] init];
[timeFormatter setDateFormat:@"h:mm a"];
}

return timeFormatter;
}

我尝试了什么

我试图简单地更新我的代码,但收到:分配给只读属性

.h

@property (nonatomic, strong, readonly) NSDateFormatter *timeFormatter;

.m

- (NSDateFormatter *)timeFormatter {
if (self.timeFormatter == nil) {
self.timeFormatter = [[NSDateFormatter alloc] init];
[self.timeFormatter setDateFormat:@"h:mm a"];
}

return self.timeFormatter;
}

我还评论了:

问题

在 iOS 5+ 中使用 ARC 延迟加载 readonly 属性的正确方法是什么?感谢 .h.m 的代码示例。

最佳答案

对于自定义(惰性)getter 方法,您必须直接访问实例变量(无论您是否使用 ARC)。所以你应该将属性综合为

@synthesize timeFormatter = _timeFormatter;

那么你的getter方法是

- (NSDateFormatter *)timeFormatter {
if (_timeFormatter == nil) {
_timeFormatter = [[NSDateFormatter alloc] init];
[_timeFormatter setDateFormat:@"h:mm a"];
}

return _timeFormatter;
}

如果同时从多个线程访问该属性,您只需添加一些同步机制,这也与 ARC 无关。

(备注:较新的 Xcode 版本可以自动创建一个 @synthesize 语句,并为实例变量使用下划线前缀。然而,在这种情况下,由于该属性被读取-只有并且您提供了一个 getter 方法,Xcode 不会自动合成该属性。)

已添加:为方便起见,这里有一个完整的代码示例:

MyClass.h:

#import <Foundation/Foundation.h>

@interface MyClass : NSObject
@property (nonatomic, strong, readonly) NSDateFormatter *timeFormatter;
@end

MyClass.m:

#import "MyClass.h"

@implementation MyClass
@synthesize timeFormatter = _timeFormatter;

- (NSDateFormatter *)timeFormatter {
if (_timeFormatter == nil) {
_timeFormatter = [[NSDateFormatter alloc] init];
[_timeFormatter setDateFormat:@"h:mm a"];
}

return _timeFormatter;
}

@end

更多信息:事实上,如果属性合成为

@synthesize timeFormatter; // or: @synthesize timeFormatter = timeFormatter;

您犯的唯一“错误”是在 getter 方法中将 timeFormatter 替换为 self.timeFormatter。这会产生两个问题:

  • 在 getter 方法中读取 self.timeFormatter 会导致无限递归。
  • 由于只读属性,不允许设置 self.timeFormatter

因此,如果您只保留 timeFormatter getter 方法(在方法内使用 timeFormatter 实例变量),那么它也适用于 ARC。

我仍然建议在我的代码示例中为属性的实例变量添加下划线前缀,因为 Xcode 对自动合成的属性采用相同的方式。

(我希望这会有所帮助并且不会增加困惑!)

关于ios - 使用 ARC 在 iOS 5+ 中延迟加载属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13670734/

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