Objective c 不使用属性就可以创建原子局部变量吗?

Objective c 不使用属性就可以创建原子局部变量吗?,objective-c,multithreading,cocoa,atomic,Objective C,Multithreading,Cocoa,Atomic,我在一个方法中,代码如下 __block NSMutableArray *myArray = [[NSMutableArray alloc] init]; [anotherArray enumerateObjectsWithOptions:NSEnumerationConcurrent usingBlock:^(id obj, NSUInteger idx, BOOL *stop) { // do some calcu

我在一个方法中,代码如下

  __block NSMutableArray *myArray = [[NSMutableArray alloc] init];

  [anotherArray enumerateObjectsWithOptions:NSEnumerationConcurrent
                            usingBlock:^(id obj, NSUInteger idx, BOOL *stop) {

     // do some calculation and generate an object
     [myArray addObject:anObject];


  }];
因为枚举是并发的,所以当几个线程试图向myArray添加对象时,我会崩溃


我知道原子属性,但我想知道是否有一种方法可以使myArray原子化并且线程安全,而不使用属性。我想让它保持本地。

因为您需要对
myArray
进行串行访问,所以使用并发枚举可能毫无意义。但是,除了将对象添加到数组之外,它还可能取决于您在枚举中执行的操作

您可以同步对阵列的访问:

@synchronized(myArray) {
    [myArray addObject:anObject];
}

运行一些性能测试,看看执行上述操作是否比简单使用串行枚举更慢,因为这样就不需要同步阵列的开销。

由于需要串行访问
myArray
,使用并发枚举可能毫无意义。但是,除了将对象添加到数组之外,它还可能取决于您在枚举中执行的操作

您可以同步对阵列的访问:

@synchronized(myArray) {
    [myArray addObject:anObject];
}
运行一些性能测试,看看执行上述操作是否比简单地使用串行枚举更慢,这会很有趣,因为这样您就不需要同步数组的开销。

旧的C数组可能会有所帮助

id array[anotherArray.count];
id __strong *arrayPtr = array;

  [anotherArray enumerateObjectsWithOptions:NSEnumerationConcurrent
                            usingBlock:^(id obj, NSUInteger idx, BOOL *stop) {

     // do some calculation and generate an object
     arrayPtr[idx] = anObject;

  }];

 NSMutableArray *myArray = [NSMutableArray arrayWithObjects:array count:anotherArray.count];
旧的C数组可能会有所帮助

id array[anotherArray.count];
id __strong *arrayPtr = array;

  [anotherArray enumerateObjectsWithOptions:NSEnumerationConcurrent
                            usingBlock:^(id obj, NSUInteger idx, BOOL *stop) {

     // do some calculation and generate an object
     arrayPtr[idx] = anObject;

  }];

 NSMutableArray *myArray = [NSMutableArray arrayWithObjects:array count:anotherArray.count];


如果您需要对
myArray
进行线程安全更新,那么为什么要使用并发枚举?因为它更快?原子属性根本没有帮助。访问属性是安全的,但属性内的对象仍然不是线程-safe@BryanChen-为什么?如果需要对
myArray
进行线程安全更新,那么为什么要使用并发枚举?因为它更快?原子属性根本没有帮助。访问属性是安全的,但属性内的对象仍然不是线程-safe@BryanChen-为什么?需要串行访问
myArray
@rmaddy可能会丢失增益,我知道。那么呢<代码>数组[idx]是每个线程的不同内存位置。没有两个线程同时访问同一地址。如果
array
NSArray
,它就不安全了,但是
id[]
第一行给了我一个错误“可变大小的对象可能无法初始化”…哎呀-我误读了你的代码。您使用的是C数组。我把它误读为另一个借口。这实际上是一个很好的解决方案。抱歉。应该指出的是,这种方法只有在生成的数组应该与原始数组有一对一的结果时才有效。@BryanChen-在初始化时有效,但在
array[idx]=anObject行失败错误为“无法引用块内具有可变修改类型的声明”@rmaddy,我知道。那么呢<代码>数组[idx]
是每个线程的不同内存位置。没有两个线程同时访问同一地址。如果
array
NSArray
,它就不安全了,但是
id[]
第一行给了我一个错误“可变大小的对象可能无法初始化”…哎呀-我误读了你的代码。您使用的是C数组。我把它误读为另一个借口。这实际上是一个很好的解决方案。抱歉。应该指出的是,这种方法只有在生成的数组应该与原始数组有一对一的结果时才有效。@BryanChen-在初始化时有效,但在
array[idx]=anObject行失败错误为“无法引用块内具有可变修改类型的声明”