Iphone 如何在objective C中创建singleton类
如何在Objective C中创建singleton类?查看此链接以获取原始源代码-Iphone 如何在objective C中创建singleton类,iphone,objective-c,singleton,Iphone,Objective C,Singleton,如何在Objective C中创建singleton类?查看此链接以获取原始源代码- 好的,appDev,您可能会在web上找到很多不同的技术来实现这一点。然而,对于iOS应用程序开发,我认为最方便的方法是执行以下操作: 编写获取singleton对象的方法。(建议:为此使用dispatch_oncethread和GCD) 将方法包装在宏中,并将其添加到$Project$-Prefix.pch文件中 每当需要类的单例对象时,调用单行宏 例如: CommonMacros.h: #define
好的,appDev,您可能会在web上找到很多不同的技术来实现这一点。然而,对于iOS应用程序开发,我认为最方便的方法是执行以下操作:
- 编写获取singleton对象的方法。(建议:为此使用
thread和GCD)dispatch_once
- 将方法包装在宏中,并将其添加到
文件中$Project$-Prefix.pch
- 每当需要类的单例对象时,调用单行宏
#define SINGLETON_FOR_CLASS(classname)
+ (id) shared##classname {
static dispatch_once_t pred = 0;
static id _sharedObject = nil;
dispatch_once(&pred, ^{
_sharedObject = [[self alloc] init];
});
return _sharedObject;
}
您的项目前缀。pch:
...
#import "CommonMacros.h"
...
...
SINGLETON_FOR_CLASS(YourSingletonClass)
...
singletonVC.sharedMySingleton.yourFunctionName
YourSingletonClass.m:
...
#import "CommonMacros.h"
...
...
SINGLETON_FOR_CLASS(YourSingletonClass)
...
singletonVC.sharedMySingleton.yourFunctionName
这是我个人最喜欢的方法:
+ (instancetype)sharedObject {
static id instance;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
instance = [[self alloc] init];
});
return instance;
}
您可以在Objective-C中实现一个单例类
+ (id)sharedManager {
static MyManager *sharedMyManager = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
sharedMyManager = [[self alloc] init];
});
return sharedMyManager;
}
- (id)init {
if (self = [super init]) {
someProperty = [[NSString alloc] initWithString:@"Default Property Value"];
}
return self;
}
我确实认为这就是我们真正实现单身行为的方式:
@interface SampleSingletonClass : NSObject
+ sharedSampleSingletonClass;
@end
@implementation SampleSingletonClass
static SampleSingletonClass *singletonObject = nil;
+ (id) sharedSampleSingletonClass
{
if (! singletonObject) {
singletonObject = [[SampleSingletonClass alloc] init];
}
return singletonObject;
}
- (id)init
{
if (! singletonObject) {
singletonObject = [super init];
// Uncomment the following line to see how many times is the init method of the class is called
// NSLog(@"%s", __PRETTY_FUNCTION__);
}
return singletonObject;
}
@end
在这里,即使调用init方法而不是预期的+(id)SampleSingleToClass;方法在应用程序的整个生命周期中,实际对象只形成一次。我知道,假定访问者知道什么是单例,但为了帮助他们不知道的人,我提出了这个简单的共享数据小示例 该对象用于共享数据类实例或类实例
@interface SharedData : NSObject {
id data;
}
- (void)setData:(id)data_;
- (id)data;
@end
@implementation SharedData
//>> singleton
static SharedData *sharedData=nil;
+ (SharedData*)sharedData {
@synchronized (self) {
if (sharedData==nil) sharedData=[[self alloc]init];
}
return sharedData;
}
//<<
- (void)setData:(id)data_ {
data=data_;
}
- (id)data {
return data;
}
@end
@接口共享数据:NSObject{
id数据;
}
-(void)setData:(id)数据;
-(id)数据;
@结束
@实现共享数据
//>>独生子女
静态SharedData*SharedData=nil;
+(SharedData*)SharedData{
@同步(自){
如果(sharedData==nil)sharedData=[[self alloc]init];
}
返回共享数据;
}
// 试试这个
Singalton class.h文件
#import <Foundation/Foundation.h>
@interface GlobleDirector : NSObject
+(GlobleDirector*)shareManager;
@end
发件人:
Objective-C中的单身人士
在为iOS开发时,我最常用的设计模式之一是singleton模式。这是一种非常强大的方式,可以在代码的不同部分之间共享数据,而无需手动传递数据
背景
单例类是一个需要理解的重要概念,因为它们展示了一种非常有用的设计模式。这一思想贯穿于iPhone SDK,例如,UIApplication有一个名为sharedApplication的方法,当从任何地方调用该方法时,将返回与当前运行的应用程序相关的UIApplication实例
如何实施
单音.h
#import <foundation/Foundation.h>
@interface Singleton : NSObject {
}
@property (nonatomic, retain) NSString *someProperty;
+ (id)sharedManager;
@end
它的作用是定义一个名为sharedMyManager的静态变量(但仅此转换单元的全局变量),然后在sharedManager中初始化一次。我们确保只创建一次的方法是使用大中央调度(GCD)中的调度方法。这是线程安全的,完全由操作系统为您处理,因此您根本不必担心它。\import
#import <Foundation/Foundation.h>
@interface singt : NSObject
+ (id)sharedManager;
@end
#import "singt.h"
@implementation singt
+ (id)sharedManager
{
static singt *sharedMyManager = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
sharedMyManager = [[self alloc] init];
});
return sharedMyManager;
}
@接口singt:NSObject
+(id)共享管理者;
@结束
#导入“singt.h”
@实现信号
+(id)共享管理器
{
静态单*sharedMyManager=nil;
静态调度一次;
一次发送(一次发送)^{
sharedMyManager=[[self alloc]init];
});
返回sharedMyManager;
}
请尝试下面的代码
@implementation AppShared
static AppShared *singletonInstance;
+ (AppShared*)Instance{
if (singletonInstance == nil) {
singletonInstance = [[super alloc] init];
}
return singletonInstance;
}
在swift 1.2
或更高版本中,如果类名为eg:singletonVC
class singletonVC {
static let sharedMySingleton = singletonVC()
private init(){
}
}
实施:
...
#import "CommonMacros.h"
...
...
SINGLETON_FOR_CLASS(YourSingletonClass)
...
singletonVC.sharedMySingleton.yourFunctionName
并添加.h
+ (id)sharedInstance;
PD:您的类应该从NSObject继承
记住,当您想使用sharedinstance时,总是调用它,而不是调用init。这是创建singleton类的正确方法
mySingletonClass.h
@interface mySingletonClass : NSObject
+ (mySingletonClass*)sharedInstance;
@property (nonatomic, assign)BOOL useToken;
mySingletonClass.m
@implementation mySingletonClass
static mySingletonClass *_sharedInstance = nil;
+ (mySingletonClass*)sharedInstance
{
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
_sharedInstance = [[self alloc] init];
});
return _sharedInstance;
}
如何访问Anotor类中的单例类属性或方法
另一个班级
可能重复:请参阅:这很好,但缺少赋值:_sharedDataModel=[[self alloc]init]@ChuckH:self不是代表_sharedMySingleton吗?@Chandu:在上面的例子中,self不是指MySingleton类的实例,而是指MySingleton类对象。如果按原样编译,编译器将发出警告,[[self alloc]init]表达式的结果未被使用。但是,上面的示例之所以有效,是因为指向原始源的链接还包含一个alloc类方法,该方法最终完成了所需的赋值。我认为消除alloc类方法并直接使用singleton实例的alloc/init结果进行静态变量赋值要容易得多。url是不鼓励使用的过时url,因此答案应该是搜索解决方案的终点(与参考文献的另一个中途停留相比,随着时间的推移,参考文献往往会变得陈旧)请考虑在这里添加一个独立的概要,保持链接作为参考。嗨,Acharya,欢迎你这么做,谢谢你的回答。这里只有代码的答案是令人沮丧的,因为它们很难让其他人理解和学习。你认为你可以编辑你的答案来解释为什么这解决了OP的问题吗?非常感谢。我一直怀疑如果有人显式调用init会发生什么。知道如何在Swift(纯单例)中实现这一点吗。@anoop4real由于不允许显式调用init,请将init设为私有。先生,为什么类*classObj=nil;这意味着指针对象没有指向内存中的任何对象。这个静态关键字在这里到底做了什么,请解释。更多信息“nil用于表示指向Objective-C对象的空指针。nil用于表示指向Objective-C类的空指针。”所以sharedMyManager是Objective-C对象或Class对象。但我相信sharedMyManager是指向Singleton类的指针对象。如果有人显式调用init怎么办?我认为你对此无能为力,ObjC实际上没有“private”和“public”的概念。