如何在 Objective-C 中的原子属性 ivar 上创建手动锁定?

发布于 2025-01-08 11:01:40 字数 475 浏览 1 评论 0原文

我想在 obj-c 类中公开一个原子属性,但在内部我更愿意直接访问它的实例变量,而不是对每个引用使用 self.myproperty 。如何手动创建锁来阻止外部读?

所以我想……

@property (atomic, strong) NSString *someString;

- myInternalMethodOfClassA
{
    ...
    @synchronized(someString) {
        someString = @"New string";
    }
    ...
}

阻止……

- myInstanceMethodInClientClassB 
{
    ClassA *myobj = [ClassA alloc] init];

    ...
    NSString *str = myobj.someString;
    ...
}

I want to expose an atomic property in my obj-c class, but internally I'd prefer to access it's instance var directly rather using self.myproperty for every reference. How do you manually create a lock to block the external read?

So I want...

@property (atomic, strong) NSString *someString;

- myInternalMethodOfClassA
{
    ...
    @synchronized(someString) {
        someString = @"New string";
    }
    ...
}

...to block...

- myInstanceMethodInClientClassB 
{
    ClassA *myobj = [ClassA alloc] init];

    ...
    NSString *str = myobj.someString;
    ...
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

桜花祭 2025-01-15 11:01:40

根据Apple Objc-lang 列表上的一些聊天,如果您手动创建一个访问器并合成另一个访问器,则具有原子属性被认为是一个错误。替代方案是:

  1. 您自己创建两个访问器并使用定制的锁定对象加上 @synchronized(anObject),然后您可以在类代码的其他位置使用它。
  2. @synthesize 它们并始终通过其访问器访问它们(即内部的 self.myAtomicProp)。这比较慢,但在几乎所有情况下很可能不是问题。

According to some chat on the Apple Objc-lang list, it's considered a bug to have an atomic property for which you manually create one accessor and synthesize the other. The alternatives are:

  1. Create both accessors yourself and use a bespoke locking object plus @synchronized(anObject), which you can then use elsewhere in your class's code.
  2. @synthesize them and always access them via their accessors (ie self.myAtomicProp internally). This is slower but most likely not a problem in nearly all cases.
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文