可能重复:
C程序中"静态"是什么意思?
static关键字在C 中的含义是什么?
我正在使用ANSI-C.我在几个代码示例中看到,它们static在变量前面和函数前面使用关键字.使用变量的目的是什么?使用函数的目的是什么?
在阅读有关线程安全的单例时,我在SO上找到了一个单例的Thread安全实例化,并且在接受的答案中这段代码:
sharedInstance = [MyClass alloc];
sharedInstance = [sharedInstance init];
Run Code Online (Sandbox Code Playgroud)
我们为什么要分开alloc和init方法?答案的作者写道:
也就是说,如果
init正在分配的类恰好调用该sharedInstance方法,它将在设置变量之前执行此操作.在这两种情况下都会导致僵局.这是你想要分开alloc的一次init.
有人可以详细向我解释这种分离的好处是什么?我无法理解作者的意思.当我创建一个单例时,我是否真的需要分离alloc和init方法调用,即使我这样做是在dispatch_once()线程安全?
multithreading initialization objective-c thread-safety grand-central-dispatch
我已经看过如何使用块在我的整个应用程序共享的每个磁盘上创建一个全局UIManagedDocument实例?但我真的不明白.
我想要实现的是,整个应用程序应该只有一个UIManagedDocument - 一个核心数据库.不同的对象应该调用一个方法并获得唯一的UIManagedDocument.
我使用一个带有类方法的辅助类:
+ (UIManagedDocument *)getsharedDatabase:(NSString *)databaseName
{
NSURL *url = [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject];
url = [url URLByAppendingPathComponent:databaseName];
// url is now "<Documents Directory>/<databaseName>"
if (![[NSFileManager defaultManager] fileExistsAtPath:[url absoluteString]])
{
// does not exist on disk, so create one
UIManagedDocument *managedDocument = [[UIManagedDocument alloc] initWithFileURL:url];
return managedDocument;
}
else
{
UIManagedDocument *managedDocument = **?????**
return managedDocument;
}
}
Run Code Online (Sandbox Code Playgroud)
正如您在问号中看到的那样,我不知道如何获取现有文件.我检查了UIManagedDocument类引用但找不到它.
你能帮我吗?提前谢谢了.
编辑 我想知道...单身方法怎么样,如:
+ (UIManagedDocument *) sharedDatabase
{
NSURL *url = [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] …Run Code Online (Sandbox Code Playgroud) 我是Objective C业务的新手(大部分时间都是Java开发人员),现在正在使用我的第一个杀手级应用程序.:-)目前我对选择器作为方法参数的使用感到困惑.例如,他们似乎与C#中的代表有点不同.
给出以下方法签名
-(void)execute:(SEL)callback;
Run Code Online (Sandbox Code Playgroud)
有没有办法强制执行传递给这种方法的选择器的签名?该方法期望具有以下签名的方法的选择器
-(void)foo:(NSData*)data;
Run Code Online (Sandbox Code Playgroud)
但SEL(类型)是通用的,因此很有可能将错误的选择器传递给 execute方法.好吧,至少在运行时,人们会看到一个有趣的行为......但我希望在发生这种情况时看到编译器警告/错误.
为了利用全局变量和方法,我将Singleton实现为一种健康的编码实践.在实施之前我跟着Apple文档,john wordsworth博客.首先,我没有使我的单例线程安全,我实现了这个方法以及博客和Apple文档中提到的所有其他方法.
+ (SingletonClass *)sharedManager
{
static SingletonClass *sharedManager = nil;
if (sharedManager == nil) {
sharedManager = [[super allocWithZone:NULL] init];
}
return sharedManager;
}
Run Code Online (Sandbox Code Playgroud)
之后,为了使Singleton线程安全,我对+ (SingletonClass *)sharedManager类进行了更改,我的应用程序停止启动.我把断点和观察到的dispatch_once两次调用,然后代码停止执行.
+(SingletonClass *)sharedManager
{
static SingletonClass *sharedManager = nil;
if (sharedManager !=nil)
{
return sharedManager;
}
static dispatch_once_t pred;
dispatch_once(&pred, ^{
sharedManager = [SingletonClass alloc];
sharedManager=[sharedManager init];
});
return sharedManager;
}
Run Code Online (Sandbox Code Playgroud)
如果我删除此线程安全代码片段并恢复到以前的代码,它工作正常,代码执行.
请注意,我也在这里查看了bbum的答案,他在提问之前提到了可能的死锁情况,但我无法弄清楚问题.任何解释或解决方案对我都有帮助.谢谢.
编辑1:
如果有人想要查看完整的代码,我已经为此创建了要点.请跟着那里.谢谢.