标签: foundation

NSIndexPath线程是否安全?

Apple的多线程文档不会NSIndexPath列为线程安全与否!作为一个不可变类,我通常认为它是线程安全的.

以前,我确信用于说明NSIndexPath实例已共享且全局唯一的文档.现在似乎已经消失了,让我怀疑iOS5/Mac OS X 10.7的设计已经修改.

我在Mac OS X 10.6(Snow Leopard)上看到了很多来自客户的崩溃报告,这些报告似乎在试图访问索引路径时崩溃.因此我想知道:实际的实例是线程安全的,但是将它们从共享缓存中拉出来的逻辑不是吗?有人有任何见解吗?

这是一个示例堆栈跟踪BTW:

Dispatch queue: com.apple.root.default-priority
0 libobjc.A.dylib 0x96513f29 _cache_getImp + 9
1 libobjc.A.dylib 0x965158f0 class_respondsToSelector + 59
2 com.apple.CoreFoundation 0x948bcb49 ___forwarding___ + 761
3 com.apple.CoreFoundation 0x948bc7d2 _CF_forwarding_prep_0 + 50
4 com.apple.Foundation 0x994b10c5 -[NSIndexPath compare:] + 93
5 com.apple.Foundation 0x99415686 _NSCompareObject + 76
6 com.apple.CoreFoundation 0x948af61c __CFSimpleMergeSort + 236
7 com.apple.CoreFoundation 0x948af576 __CFSimpleMergeSort + 70
8 com.apple.CoreFoundation 0x948af38c CFSortIndexes + 252
9 com.apple.CoreFoundation 0x948fe80d CFMergeSortArray + 125 …
Run Code Online (Sandbox Code Playgroud)

cocoa multithreading core-data foundation nsindexpath

16
推荐指数
1
解决办法
915
查看次数

如何在Swift中使用KVO for UserDefaults?

我正在重写应用程序的一部分,并找到了这段代码:

fileprivate let defaults = UserDefaults.standard

func storeValue(_ value: AnyObject, forKey key:String) {
    defaults.set(value, forKey: key)
    defaults.synchronize()

    NotificationCenter.default.post(name: Notification.Name(rawValue: "persistanceServiceValueChangedNotification"), object: key)
}
func getValueForKey(_ key:String, defaultValue:AnyObject? = nil) -> AnyObject? {
    return defaults.object(forKey: key) as AnyObject? ?? defaultValue
}
Run Code Online (Sandbox Code Playgroud)

当CMD点击该行时,defaults.synchronize()我看到synchronize计划已弃用.这是在代码中写的:

/*!
     -synchronize is deprecated and will be marked with the NS_DEPRECATED macro in a future release.

     -synchronize blocks the calling thread until all in-progress set operations have completed. This is no longer necessary. Replacements for …
Run Code Online (Sandbox Code Playgroud)

key-value-observing foundation ios swift

16
推荐指数
3
解决办法
6718
查看次数

CFRunLoopRun()vs [NSRunLoop运行]

我有一个NSRunLoop对象,我附加了定时器和流.它很棒.停止它是另一个故事.

我使用循环运行[runLoop run].

如果我尝试停止循环使用CRunLoopStop([[NSRunLoop currentRunLoop] getCFRunLoop]),循环将不会停止.如果我使用CRunLoopRun()相反的方式启动循环,它可以工作.我还确保调用是在正确的线程(运行我的自定义运行循环的线程)上进行的.我调试了这个pthread_self().

我找到了一个邮件列表存档,开发人员说" CRunLoopStop()如果使用run方法启动循环,就不要使用NSRunLoop".我可以理解为什么它是这样的 - 你通常将初始化器和终结器配对来自同一组函数.

如何在NSRunLoop没有"诉诸CF" 的情况下停止?我没有看到stop方法NSRunLoop.文档说你可以通过三种方式停止运行循环:

  1. 配置运行循环以使用超时值运行
  2. 告诉运行循环停止使用 CFRunLoopStop()
  3. 删除所有输入源,但这是一种不可靠的方法来停止运行循环,因为你永远无法知道什么困在你背后的运行循环中

好吧,我已经尝试过2.并且有一种"丑陋"的感觉,因为你必须深入研究CF. 3.不可能 - 我不喜欢非确定性代码.

这给我们留下了1.如果我理解正确的文档,你不能"添加"超时已经存在的运行循环.您只能在超时时运行新的运行循环.如果我运行一个新的运行循环,它将无法解决我的问题,因为它只会创建一个嵌套的运行循环.我仍然会回到原来的那个,同样我想停止......对吧?我可能误解了这个.另外,我不想使用超时值运行循环.如果我这样做,我将不得不在刻录CPU周期(低超时值)和响应性(高超时值)之间进行权衡.

这是我现在的设置(伪代码):

Communicator.h

@interface Communicator : NSObject {
    NSThread* commThread;
}

-(void) start;
-(void) stop;
@end
Run Code Online (Sandbox Code Playgroud)

Communicator.m

@interface Communicator (private)
-(void) threadLoop:(id) argument;
-(void) stopThread;
@end

@implementation Communicator
-(void) start {
    thread = [[NSThread alloc] initWithTarget:self 
                                     selector:@selector(threadLoop:)
                                       object:nil];
    [thread start];
}

-(void) stop …
Run Code Online (Sandbox Code Playgroud)

macos core-foundation foundation cfrunloop nsrunloop

15
推荐指数
1
解决办法
8001
查看次数

Swift Playground - 文件不可读

Swift Playground中无法读取文件.

如何使文件可读?

相同的代码在Xcode终端应用程序上运行良好,但在Swift Playground上失败.

下面的演示代码.

import Foundation

println("Hello, World!")

var fname:String = "/Users/holyfield/Desktop/com.apple.IconComposer.plist"
var fm:NSFileManager = NSFileManager.defaultManager()

if(fm.fileExistsAtPath(fname)){
    println("File Exists")
    if(fm.isReadableFileAtPath(fname)){
        println("File is readable")
        var fd:NSData? = NSData(contentsOfFile: fname)
        println(fd?.length)
        let pl = NSDictionary(contentsOfFile: fname)
        println(pl?.count)
        println(pl?.allKeys)
    }else{
        println("File is not readable")
    }
}
else{
    println("File does not exists")
}
Run Code Online (Sandbox Code Playgroud)

示例图片:

XCode终端应用程序 斯威夫特游乐场

xcode foundation swift xcode6 swift-playground

15
推荐指数
2
解决办法
8501
查看次数

如何删除Documents目录的内容(而不是Documents目录本身)?

我想删除Documents目录中包含的所有文件和目录.

我相信使用[fileManager removeItemAtPath:documentsDirectoryPath error:nil] 方法也会删除文档目录.

是否有任何方法可以删除目录的内容并将空目录留在那里?

iphone objective-c foundation

14
推荐指数
1
解决办法
9240
查看次数

containsObject:和NSSet的成员:方法之间的区别?

属于NSSet类的这两个方法之间的区别是什么:

-(BOOL)containsObject:(id)anObject
-(id)member:(id)object 
Run Code Online (Sandbox Code Playgroud)

iphone objective-c foundation ios

14
推荐指数
1
解决办法
5288
查看次数

NSLocaleCountryCode返回nil

我有一个bug报告,在下一行中说明崩溃,其中client是一个实例 NSMutableDictionary

[client setObject:[[NSLocale currentLocale] objectForKey:NSLocaleCountryCode] forKey:@"country"];
Run Code Online (Sandbox Code Playgroud)

我的猜测是,NSLocaleCountryCode在这一行中返回nil,这导致向一个NSDictionary导致崩溃的nil对象添加.问题是,有没有人经历过这样的问题?有什么理由NSLocaleCountryCode可以为零currentLocale吗?文档没有说明返回零值,我认为这将总是返回一个有效的国家.

最好的问候,迈克尔

country foundation ios nslocale

14
推荐指数
2
解决办法
6684
查看次数

将非NSObject添加到NSMutableArray

最近的SO 讨论使我感到困惑.NSMutableArray原型addObject:

- (void)addObject:(id)anObject
Run Code Online (Sandbox Code Playgroud)

id在objc.h中定义为

typedef struct objc_class *Class;
typedef struct objc_object {
    Class isa;
} *id; 
Run Code Online (Sandbox Code Playgroud)

当我将一个NSObject或子类添加到一个时NSMutableArray,它的保留计数会递增,当我从中删除它时,NSMutableArray它会递减.这是否意味着如果一个id type不是一个NSObject或一个子类被添加到一个NSMutableArray,它必须响应保留和释放消息?这个定义id似乎并不强迫这一点.它是一个客观的C指令,任何人id type都应该响应标准的内存管理消息吗?

reference-counting objective-c foundation nsarray ios

13
推荐指数
1
解决办法
1110
查看次数

[__NSDictionaryI setObject:forKey:]:发送到实例的无法识别的选择器

我正在尝试将"dateTime"添加到我的字典中,如下所示:

Symptom Ranking: {
    5111ef19253b4a9150000000 = 1;
    5111f029253b4add4e000000 = 1;
    5111f036253b4a123d000001 = 1;
    5111f045253b4a404f000000 = 1;
}

NSLog(@"date selected: %@", [[self.datePicker date] description])

[self.results setObject:[[self.datePicker date] description] forKey:@"dateTime"];
Run Code Online (Sandbox Code Playgroud)

应用程序崩溃,我得到这个:

Symptom Tracker[43134:c07] -[__NSDictionaryI setObject:forKey:]: unrecognized selector sent to instance 0x7603990
2013-02-06 08:15:58.741 Symptom Tracker[43134:c07] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSDictionaryI setObject:forKey:]: unrecognized selector sent to instance 0x7603990'
*** First throw call stack:
(0x171b012 0x1428e7e 0x17a64bd 0x170abbc 0x170a94e 0x521e 0x143c705 0x373920 0x3738b8 0x434671 0x434bcf 0x433d38 0x3a333f 0x3a3552 0x3813aa …
Run Code Online (Sandbox Code Playgroud)

nsdictionary foundation nsmutabledictionary ios

13
推荐指数
5
解决办法
2万
查看次数

DateComponentsFormatter可以格式化小数秒吗?

我想打印,例如,值1.5为"1.5秒",就像Safari的时间轴一样,我正在尝试使用DateComponentsFormatter.

不幸的是,它.allowedUnits只能归结为.second(即使枚举有.nanosecond).我尝试过设置.allowsFractionalUnits = true,但我仍然得到"0秒".

有没有办法从DateComponentsFormatter中获得小数秒?

macos foundation nsdatecomponents nsdatecomponentsformatter

12
推荐指数
1
解决办法
270
查看次数