gpt4 book ai didi

objective-c - Objective-C 中的单例属性访问

转载 作者:行者123 更新时间:2023-12-02 22:28:33 24 4
gpt4 key购买 nike

我正在使用一个标准的现代单例类,其中一个单例持有一个 CTFontRef,如下所示:

@interface MySingleton : NSObject {
CTFontRef paintingFont;
}

@property (readonly) CTFontRef paintingFont;

@end


@implementation MySingleton

+ (MySingleton*)sharedInstance
{
static dispatch_once_t once;
static MySingleton *sharedInstance;
dispatch_once(&once, ^{
sharedInstance = [[self alloc] init];

//NB
sharedInstance->paintingFont =
CTFontCreateWithName(CFSTR("Helvetica"), 80.0, nil);
});
return sharedInstance;
}

@end

然后我在其他地方调用 [[MySingleton sharedinstance] paintingFont]

但是,此调用返回 nil 直到我在 paintingFont 之前插入下划线,如下所示:

        sharedInstance->_paintingFont = 
CTFontCreateWithName(CFSTR("Helvetica"), 80.0, nil);

这是为什么?编译器不应该要求我包含下划线吗?如果不是,早期版本的目的是什么?这个下划线是从哪里来的?我从来没有用下划线开头声明该属性,我只是在调试器窗口中看到这些看似随机插入到变量名称中的行为。

最佳答案

从 Xcode 4.4 开始,当您声明一个 @property 时,编译器会自动为您创建一个 ivar 和 @synthesize 访问器方法。默认的 ivar 是带下划线的。

使用 -> 语法,您可以直接访问 ivars 而不是属性。因此,在您的 sharedInstance 方法中,您可以设置自己的 ivar(不带下划线)。但是,当您稍后尝试访问它时,您将使用 [ ],它将使用自动合成的 getter 方法来访问您的属性(以及自动生成的带有下划线的 ivar)。

您应该使用 . 表示法而不是 -> 来访问该属性。或者简单地使用名为 _paintingFont 的自动生成的 ivar。

您还可以通过添加以下代码在您的实现文件中创建属性读写。这将允许您在实现中使用点语法来设置属性,但对于其他类仍将其保留为只读。

@interface MySingleton ()
@property (readwrite) CTFontRef paintingFont;
@end

如果你想要一个不同的ivar,你可以使用@synthesize来覆盖它。在这两种情况下,您都不必再声明 ivar。

@implementation MySingleton
@synthesize paintingFont;
....
@end

关于objective-c - Objective-C 中的单例属性访问,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12631705/

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