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) 我正在重写应用程序的一部分,并找到了这段代码:
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) 我有一个NSRunLoop对象,我附加了定时器和流.它很棒.停止它是另一个故事.
我使用循环运行[runLoop run].
如果我尝试停止循环使用CRunLoopStop([[NSRunLoop currentRunLoop] getCFRunLoop]),循环将不会停止.如果我使用CRunLoopRun()相反的方式启动循环,它可以工作.我还确保调用是在正确的线程(运行我的自定义运行循环的线程)上进行的.我调试了这个pthread_self().
我找到了一个邮件列表存档,开发人员说" CRunLoopStop()如果使用run方法启动循环,就不要使用NSRunLoop".我可以理解为什么它是这样的 - 你通常将初始化器和终结器配对来自同一组函数.
如何在NSRunLoop没有"诉诸CF" 的情况下停止?我没有看到stop方法NSRunLoop.文档说你可以通过三种方式停止运行循环:
CFRunLoopStop()好吧,我已经尝试过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) 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)
示例图片:

我想删除Documents目录中包含的所有文件和目录.
我相信使用[fileManager removeItemAtPath:documentsDirectoryPath error:nil] 方法也会删除文档目录.
是否有任何方法可以删除目录的内容并将空目录留在那里?
属于NSSet类的这两个方法之间的区别是什么:
-(BOOL)containsObject:(id)anObject
-(id)member:(id)object
Run Code Online (Sandbox Code Playgroud) 我有一个bug报告,在下一行中说明崩溃,其中client是一个实例 NSMutableDictionary
[client setObject:[[NSLocale currentLocale] objectForKey:NSLocaleCountryCode] forKey:@"country"];
Run Code Online (Sandbox Code Playgroud)
我的猜测是,NSLocaleCountryCode在这一行中返回nil,这导致向一个NSDictionary导致崩溃的nil对象添加.问题是,有没有人经历过这样的问题?有什么理由NSLocaleCountryCode可以为零currentLocale吗?文档没有说明返回零值,我认为这将总是返回一个有效的国家.
最好的问候,迈克尔
最近的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都应该响应标准的内存管理消息吗?
我正在尝试将"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) 我想打印,例如,值1.5为"1.5秒",就像Safari的时间轴一样,我正在尝试使用DateComponentsFormatter.
不幸的是,它.allowedUnits只能归结为.second(即使枚举有.nanosecond).我尝试过设置.allowsFractionalUnits = true,但我仍然得到"0秒".
有没有办法从DateComponentsFormatter中获得小数秒?
foundation ×10
ios ×5
objective-c ×3
iphone ×2
macos ×2
swift ×2
cfrunloop ×1
cocoa ×1
core-data ×1
country ×1
nsarray ×1
nsdictionary ×1
nsindexpath ×1
nslocale ×1
nsrunloop ×1
xcode ×1
xcode6 ×1