@synchronized参数具有相同的值但不同的引用?

时间:2015-01-21 17:19:16

标签: ios objective-c synchronization

我对@synchronized所采用的参数有疑问,我已经阅读了有关同步的Apple文档,但我仍然没有明确的想法。

我有一个案例,@synchronized会在某个对象中包含一个字符串属性,如下所示:

@synchronized(someObject.A)

因为A是NSString对象,并且在某些情况下将携带相同的值,但来自不同的someObject,这将保证锁定具有相同A值的所有对象?

2 个答案:

答案 0 :(得分:1)

值得注意的是NSString有一些神奇的处理特殊情况。

NSString *s1 = @"Test string";
NSString *s2 = @"Test string";

这里,s1s2实际上被编译为访问相同的内存地址,即使它们是不同的变量,并且可以在应用程序中的完全不同的位置实例化。

但是,如果您正在动态加载数据或使用NSString的构造方法之一而不是硬编码,那么匹配字符的字符串将不会共享相同的内存

您可以认为这与==isEqualToString:进行比较时存在差异。 @synchronized仅使用==结果。

所以,回答你的问题:也许

如果您在应用程序中使用@"some string"形式的硬编码值,则@synchronized命令将链接到A共享相同文本值的所有对象。

如果您通过任何其他方式创建NSString个对象,则@synchronized命令将仅链接到指向完全相同的NSString对象的对象。

答案 1 :(得分:0)

同步将在someObject.A当前引用的任何对象上完成。重要的部分是您使用@synchronized的实际对象。

如果将相同的字符串分配给两个完全不同的属性,然后在这两个完全不同的属性上使用@synchronized,那么它将起作用,因为它们都指向相同的字符串。

以下示例可能有所帮助:

// In one method
@synchronized(someObject.A) {
}

// In another method
NSString *foo = someObject.A;
@synchronized(foo) {
}

以上两个块对同一个字符串对象是线程安全的。