【问题标题】:Can I use identical NSStrings as one sempahore for @synchronized我可以使用相同的 NSStrings 作为 @synchronized 的一个信号量吗
【发布时间】:2013-05-17 13:42:30
【问题描述】:

据我所知,相同的 NSString 被优化为在大多数(所有?)情况下它们实际上是同一个对象。

如果是,这是否意味着我可以使用 NSString 指针作为 @synchronized 指令的信号量,并在使用与信号量相同的字符串执行代码块时阻止它?

- (void)doSomethingWithAString:(NSString *)myString
{
    @synchronized(myString) {
        //Something time intensive that never happens in parallel for the exact same myString
    }
}

【问题讨论】:

    标签: ios nsstring semaphore


    【解决方案1】:

    不,具有相同字符串的文字 NSString 实例不再保证是相同地址的相同实例。这是前一段时间所做的更改。

    您可以使用全局字符串:

    在文件.h中

    extern NSString *const MY_SYNC_STRING;
    

    在文件.m中

    NSString *MY_SYNC_STRING = @"MYSyncString";
    

    在 otherFile.m 中

    #import "file.h"
        ...
        @synchronized(MY_SYNC_STRING) {
        ...
    

    【讨论】:

    • 好的。还有其他想法如何实现字符串内容依赖锁吗?
    • 好的,谢谢。不过,全局字符串并不能真正解决问题。
    • 您可以添加一个方法,将字符串对象缓存在字典中,以字符串名称为键。你会调用 @synchronized( [myClass getSharedObject:myString]) 。当然,您需要将对象添加到具有全局锁的共享字符串字典中。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-23
    • 1970-01-01
    • 2017-03-13
    相关资源
    最近更新 更多