LSSingleInsten.h
#import <Foundation/Foundation.h>
@interface LSSingleInsten : NSObject
@property (nonatomic,assign) NSInteger Value;
+ (LSSingleInsten*)CreateInsten;
@end
LSSingleInsten.m
#import "LSSingleInsten.h"
static LSSingleInsten *shareInsten = nil;
@implementation LSSingleInsten
+ (LSSingleInsten*)CreateInsten
{
if (shareInsten == nil) {
shareInsten = [[self alloc]init];
}
return shareInsten;
}
//以下都是防止实例不是唯一的一些方法,是通用格式,不必死记硬背,可以直接拷贝到任何单例模式中
这是在调用alloc时可防止重复创建实例
+(id)allocWithZone:(NSZone *)zone{
if (shareInsten==nil) {
// shareInsten=[super allocWithZone:zone];
shareInsten = [super allocWithZone:zone];
}
return shareInsten;
}
//这是在拷贝对象时防止重复创建
-(id)copyWithZone:(NSZone *)zone{
return shareInsten;
}
//这是在retain对象时防止重复创建,当然在ARC开启时可省略这个
-(id)retain{
return shareInsten;
}
//在release时什么都不做,因为一共就一个实例,不重复引用,所以不能release
-(oneway void)release{
}
//在autorelease时,返回实例,在ARC下客省略
-(id)autorelease{
return shareInsten;
}
//返回的时无符号整型,即大于0的数字,在ARC下可省略
-(NSUInteger)retainCount{
return UINT_MAX;
}
@end
main.m
#import <Foundation/Foundation.h>
#import "LSSingleInsten.h"
int main(int argc, const char * argv[])
{
@autoreleasepool {
LSSingleInsten *lsinsten = [LSSingleInsten CreateInsten];
lsinsten.Value = 100;
NSLog(@"%@",lsinsten);
NSLog(@"%@",[LSSingleInsten CreateInsten]);
NSLog(@"%ld",lsinsten.Value);
LSSingleInsten *lsinsten2 = [LSSingleInsten CreateInsten];
NSLog(@"%@",lsinsten2);
NSLog(@"%@",[LSSingleInsten CreateInsten]);
NSLog(@"%ld",lsinsten2.Value);
LSSingleInsten *lsinsten3 = [[LSSingleInsten alloc]init];
NSLog(@"%@",lsinsten3);
NSLog(@"%ld",lsinsten3.Value);
LSSingleInsten *lsinsten4 = [lsinsten copy];
NSLog(@"%@",lsinsten4);
NSLog(@"%ld",lsinsten4.Value);
}
return 0;
}
测试结果:
<LSSingleInsten: 0x1003023a0>
<LSSingleInsten: 0x1003023a0>
100
<LSSingleInsten: 0x1003023a0>
<LSSingleInsten: 0x1003023a0>
100
<LSSingleInsten: 0x1003023a0>
100
<LSSingleInsten: 0x1003023a0>
100