Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.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 Cocoa/目标C:方法和线程安全_Objective C_Cocoa_Thread Safety - Fatal编程技术网

Objective c Cocoa/目标C:方法和线程安全

Objective c Cocoa/目标C:方法和线程安全,objective-c,cocoa,thread-safety,Objective C,Cocoa,Thread Safety,在Cocoa/Objective C中,静态类方法是线程安全的吗?我正在定义一个类来进行相关的自定义URL请求,我希望从许多不同的线程调用该类。假设我有一门课: @interface URLConnector : NSObject { } +(Response *)getData:(NSString *)category; +(Response *)put:(NSString *)category content:(NSData *)content; @end 每个方法都定义一个NSMutab

在Cocoa/Objective C中,静态类方法是线程安全的吗?我正在定义一个类来进行相关的自定义URL请求,我希望从许多不同的线程调用该类。假设我有一门课:

@interface URLConnector : NSObject {
}
+(Response *)getData:(NSString *)category;
+(Response *)put:(NSString *)category content:(NSData *)content;
@end
每个方法都定义一个NSMutableURLRequest,调用它,并使用nsrunlop:rununtelDate:等待响应。它们还创建另一个类URLConnectorDelegate的实例来处理来自NSMutableRequests的回调,并在返回之前释放它们。(注意:此代码基于用于发出URL请求的常用公共库)

我喜欢这种方法的地方在于它使所有线程保持简单,并将所有与服务器相关的自定义代码放在一个地方。线程可以通过单个函数调用执行URL请求


我的所有线程是否都可以同时使用这些静态函数来进行同步调用(即静态objective-c方法是否本质上是线程安全的)

我看不出有任何方法可以在类方法中完成所有处理,而不使用实例变量,这些变量可能会被各种线程踩死。我认为您需要使这些方法成为普通的实例方法,并为每个线程分配一个实例。我不知道为什么你一开始就把它们当作类方法。

我看不出你可以用任何方法来处理类方法中的所有处理,而不使用可以从各种线程中获得的实例变量。我认为您需要使这些方法成为普通的实例方法,并为每个线程分配一个实例。我不知道为什么你会首先考虑把它们作为类方法。

作为一种类方法对线程安全没有任何影响。重要的是如何访问数据。如果以非线程安全的方式访问数据,则该方法不是线程安全的


我只需将
NSURLConnection
连接到主运行循环,URL加载系统就可以像设计的那样管理自己,而不是自己运行循环。请参阅
NSURLConnection scheduleinrunlop:forMode:

作为一个类方法对线程安全没有任何影响。重要的是如何访问数据。如果以非线程安全的方式访问数据,则该方法不是线程安全的


我只需将
NSURLConnection
连接到主运行循环,URL加载系统就可以像设计的那样管理自己,而不是自己运行循环。如果在这些类方法中没有修改全局/静态变量,请参见
NSURLConnection scheduleinrunop:forMode:
假设您正在调用当前线程的运行循环(即调用您的类方法的线程),以获取当前线程的运行循环,我认为它们应该是线程安全的。

假设您正在为当前线程的运行循环(即,无论哪个线程调用您的类方法)调用
NSRunLoop:runUntilDate:
,如果这些类方法中没有修改全局/静态变量,我相信它们应该是线程安全的。

如果您知道您将使用后台线程,为什么不使用
+[NSURLConnection sendSynchronousRequest:returningResponse:error:
,然后完成它呢

不需要运行循环的模糊。如果你只使用局部变量和参数,你几乎不用做任何工作就可以得到线程安全

否则,线程安全性取决于方法类型


类方法并不比实例方法更安全。实际上,运行时对这两种方法的处理是相同的。该类实际上是其元类的对象实例,因此对类方法的调用是对对象的普通方法调用。

如果您知道您将在后台线程上,为什么不直接使用
+[NSURLConnection sendSynchronousRequest:returningResponse:error:
并完成它

不需要运行循环的模糊。如果你只使用局部变量和参数,你几乎不用做任何工作就可以得到线程安全

否则,线程安全性取决于方法类型


类方法并不比实例方法更安全。实际上,运行时对这两种方法的处理是相同的。该类实际上是其元类的对象实例,因此对类方法的调用是对对象的普通方法调用。

我应该包括,每次调用它们时,静态方法都会创建一个新的连接委托对象来处理响应。我将编辑原始帖子。我应该包括,每次调用它们时,静态方法都会创建一个新的连接委托对象来处理响应。我将编辑原始帖子。那么,就局部变量而言,这两种方法都是线程安全的吗?例如,如果我迭代一个局部变量-For(int i=0;i@Colin:堆栈上的任何局部变量都是线程局部的,因此是安全的。因此,只要您不使用标记为
static
的变量,或以任何其他方式在方法的作用域之外保持活动状态,您就是安全的。那么,就其局部变量而言,这两种方法都是线程安全的吗?例如,如果我迭代了一个局部变量-for(int i=0;i@Colin:堆栈上的任何局部变量都是线程局部的,因此是安全的。因此,只要您不使用标记为
static
的变量,或者以任何其他方式在方法的范围外保持活动状态,您就是安全的。我编辑了这个问题,并提供了一些关于为什么要使用这种方法的更多信息,尽管我接受了您的观点t、 我在网上研究了一下这个话题,有些人报告说,他们通过这种方式成功地运行了自己的运行循环,但可能会遇到与NSURLConnection本身有关的问题。我编辑了这个问题,并提供了一些关于我为什么要使用这种方法的更多信息,不过我同意你的观点。我在网上研究了一下这个话题