相关疑难解决方法(0)

从不同的线程使用时,NSDateFormatter崩溃

我们不断得到一个随机的,奇怪的崩溃NSDateFormatter.相关的堆栈跟踪是:

Program received signal:  “EXC_BAD_ACCESS”.
#0  0x00000005 in ?? ()
#1  0x0213e3c3 in udat_parse ()
#2  0x01d4e1ca in CFDateFormatterGetAbsoluteTimeFromString ()
#3  0x01d4e225 in CFDateFormatterCreateDateFromString ()
#4  0x003e2608 in getObjectValue ()
#5  0x003e2921 in -[NSDateFormatter getObjectValue:forString:errorDescription:] ()
#6  0x003e21cd in -[NSDateFormatter dateFromString:] ()
Run Code Online (Sandbox Code Playgroud)

日期格式化程序仍在内存中(即未释放或损坏).我唯一能想到的是崩溃时的字符串不符合格式,但我怀疑这会使格式化程序完全崩溃.(事先检查格式是非常简单的).

有什么想法吗?

multithreading exc-bad-access objective-c nsdateformatter ios

18
推荐指数
1
解决办法
5883
查看次数

线程本地存储和iOS

我的理解是iOS不支持__thread.显然,有一种方法可以使用pthread_setspecific.但是,是否已经有一个已实现此功能的模板类?

我不得不重新发明轮子,特别是因为它不是一段简单的代码.

任何链接将非常感谢!

干杯

c++ templates pthreads thread-local-storage ios

9
推荐指数
1
解决办法
5231
查看次数

怀疑与可以多次使用的对象(如格式化程序)的并发性

也许是一个愚蠢的问题,但我需要一些确认.

通常,当我处理可以在我的应用程序中多次使用的对象时,我使用如下方法.

例如NSDecimalNumber+Extension,创建一个扩展,或者创建一个数字格式化程序的类实用程序,如下所示.

+ (NSNumberFormatter*)internal_sharedNumberFormatter
{
    static NSNumberFormatter* _internal_numberFormatter = nil;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        _internal_numberFormatter = [[NSNumberFormatter alloc] init];
        // other configurations here...
    });

    return _internal_numberFormatter;
}

+ (NSString*)stringRepresentationOfDecimalNumber:(NSDecimalNumber*)numberToFormat
{
    NSString *stringRepresentation = [[self class] internal_sharedNumberFormatter] stringFromNumber:numberToFormat];
    return stringRepresentation;
}
Run Code Online (Sandbox Code Playgroud)

这种方法非常好,因为例如格式化程序的创建成本很高.但它也可以应用于其他情况.

现在,我的问题如下.

在涉及不同执行路径(不同线程)的情况下,此方法是否也有效?

所以,如果我先stringRepresentationOfDecimalNumber在主线程上调用然后在另一个线程中调用,会发生什么?

我认为stringRepresentationOfDecimalNumber在不同的线程中执行不同的调用是有效的,因为共享格式化程序,在这种情况下,只是只读,但我想得到专家的回复.

提前致谢.

concurrency code-reuse objective-c nsformatter

5
推荐指数
1
解决办法
214
查看次数