Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 用'包装NSArray操作@已同步';,仍然崩溃_Objective C_Multithreading_Synchronized - Fatal编程技术网

Objective c 用'包装NSArray操作@已同步';,仍然崩溃

Objective c 用'包装NSArray操作@已同步';,仍然崩溃,objective-c,multithreading,synchronized,Objective C,Multithreading,Synchronized,我有下面的类,其中我有几个方法可以使用cachedRequestsarray进行操作 MyClass.h @interface MyClass : NSObject { NSMutableArray *cachedRequests; } +(MyClass*) instance; //Singleton MyClass.m @interface MyClass () - (void) sendFromCache:(CacheData*)data; @end @implemen

我有下面的类,其中我有几个方法可以使用
cachedRequests
array进行操作

MyClass.h

@interface MyClass : NSObject {
    NSMutableArray *cachedRequests;    
}
+(MyClass*) instance; //Singleton
MyClass.m

@interface MyClass ()
- (void) sendFromCache:(CacheData*)data;
@end

@implementation MyClass

static MyClass *sharedSingleton = nil;

+(MyClass*) instance{
@synchronized(self) {
    if(sharedSingleton == nil)
        sharedSingleton = [[super allocWithZone:NULL] init];
  }
  return sharedSingleton;
}

   - (void) initialize 
   { 
        cachedRequests = nil;
    }

   - (void) processCache
  {   
       cachedRequests = [self getCachedRequests];
  }    

  - (void) sendNext
 {       
  @synchronized (self)
  {

    if (cachedRequests != nil && [cachedRequests count] == 0){
        return;
    }
    CacheData *data = [cachedRequests objectAtIndex:0]; // <-- here I get Crash 


    if (data != nil) {
        [cachedRequests removeObject:requestData];
    }
  }
}


@end
问题是:

  • 够了吗?我是否需要为
    cachedRequests=[self getCachedRequests]添加
    @synchronized(self)
  • 改用:
    @synchronized(cachedRequests)
    是否是一种良好的做法

坠机详情:

2   CoreFoundation                  0x18595af68 -[__NSArrayM objectAtIndex:] + 240 (NSArray.m:410)
3   living                          0x100c56a1c -[RequestCache sendNext] + 168

您的变量
cachedRequests
是一个全局变量,由
MyClass
的所有实例共享,因此不同的intance在不同的
self
对象上同步以访问相同的数组-这很容易成为崩溃的根源

您可能想通过在大括号中声明实例变量来声明实例变量:

@implementation MyClass
{
    NSMutableArray *cachedRequests;
}
正如您所怀疑的,您还应该保护对变量的每次访问


HTH

更新,谢谢,`NSMutableArray*cachedRequests;`我向校长宣布还有什么问题?在使用
@synchronized
保护每次使用后,作为实例变量的
cachedRequests
是否仍会导致崩溃?我仅使用
@synchronized
方法进行保护,如上所述。但仍然有崩溃。所以现在我将
@synchronized
包装在
cachedRequests=nil我的类是Singleton。请看我问的问题。谢谢,因为答案说你必须“保护每个对变量的访问”——所有访问实例变量的实例方法都必须具有独占访问权,否则就没有独占访问权!顺便说一句,最好在实现中声明实例变量,如答案所示,而不是在标题中声明,如编辑的问题所示。头文件中声明的实例变量可以从实现外部轻松访问,在这种情况下会绕过线程保护。无法从外部直接访问实现中声明的实例变量。
@implementation MyClass
{
    NSMutableArray *cachedRequests;
}