【问题标题】:Does @synchronized(self) create a block where the self prefix is unecessary on properties?@synchronized(self) 是否会创建一个在属性上不需要 self 前缀的块?
【发布时间】:2011-06-06 23:18:12
【问题描述】:

我读过一些外国代码,我想检查一下我的假设:

@synchronized(self) 用于在设置属性时去掉self 前缀。

所以在下面的示例中,我设置了实例的strText,而不仅仅是一个局部变量,对吧?

- (void)myfunction{
    NSString * strText = @"var in function";
    @synchronized(self)
    {
         strText = @"var class (self.strText)";
    }

}

【问题讨论】:

    标签: objective-c synchronized self declared-property


    【解决方案1】:

    请阅读此Documentation

    @synchronized() 指令锁定一段代码以供 单线程。其他线程被阻塞,直到线程退出 受保护的代码——也就是说,当执行持续到最后一个 @synchronized() 块中的语句。

    @synchronized() 指令将任何参数作为其唯一参数 Objective-C 对象,包括self

    作为Massimo Cafaro pointed out: “在应用程序变为多线程之前创建所有互斥对象是最安全的,以避免竞争条件。”

    【讨论】:

    【解决方案2】:

    @synchronized(self) 用于摆脱自我。前缀。

    所以在我的示例中,我将 strText 设置为不在我设置的函数中 类。

    两个概念被混为一谈。

    1. @synchronized(self) { ... } 仅使用self 对象作为信号量锁定块。
    2. 在 Objective-C 中,没有什么能像在其他语言中那样假设 with 语句消除了将 self.whatever 改为 whatever 的需要。可能想参加斯坦福 CS193P 在线课程来复习这门语言。

    【讨论】:

    • 为什么是这个答案?它可能会“回答”这个问题,但是——无意冒犯——你只会觉得简洁而无益。
    • @synchronized 对您是否需要“自我”没有影响。字首。它们在任何方面都无关。
    • 这是三个真正解决问题@Matt 中的误解的唯一答案。另外两个只是鹦鹉学舌 @synchronized()
    • @JoshCaswell 跟踪,但我的评论来自 2013 年,并且在 2014 年,Barry 编辑了这篇文章,实际上说了“你错了”之外的其他内容。我想你是对的,这篇文章现在更好地“回答了这个问题”。
    • 哎呀,对不起,马特,我绝对应该考虑查看修订历史记录。
    【解决方案3】:

    在多线程环境中,如果多个线程尝试访问 相同的内存地址可能会导致“竞争条件”,以避免这种情况 您应该使用“互斥锁(互斥)”的条件 但是阻塞或限制或锁定要访问的 n 个线程 在同一时间点相同的内存地址或内容,并允许 在一个实例中只有一个线程。这可以在 Objective C 使用 @synchronized 指令。

    示例: 通常在实现 Singleton 设计模式或类时,您会在任何 iOS 项目中看到如下所示的某种代码 sn-p,

    +(id)getSingletonInstance
    {
        @synchronized(self)
        {
            if (singletonObj == nil)
            {
                singletonObj = [[self alloc] init];
            }
            return singletonObj;
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2015-03-21
      • 2017-01-03
      • 1970-01-01
      • 1970-01-01
      • 2016-07-05
      • 1970-01-01
      • 2021-11-06
      • 2021-04-10
      • 1970-01-01
      相关资源
      最近更新 更多