Objective-C单例

一、要点:
1.当在应用程序中只需要有类的一个实例,并且可以被其它对象轻松的访问的时候,可以使用单例类。
2.首先需要声明一个静态的类的实例变量,并初始化为nil。应该将该实例变量声明在类的实现文件中,表示变量仅在该实现文件中有效。
3.添加工厂方法,用于创建并返回单例类的实例,在需要线程安全的情况下,需要添加同步代码。
4.为了防止用户调用alloc等方法创建或者做其它影响生命周期的操作,我们需要重载一些方法。

二、具体实现实例如下(苹果推荐实现):

1.头文件:

@interface MyGizmoClass : NSObject

+(MyGizmoClass*)sharedManager;

@end

2.实现文件

#import "MyGizmoClass.h"

static MyGizmoClass *sharedGizmoManager = nil;

@implementation MyGizmoClass
 
+(MyGizmoClass*)sharedManager{
    @synchronized(self) {
        if (sharedGizmoManager == nil) {
            sharedGizmoManager = [[super allocWithZone:NULL] init];
        }
    }
    return sharedGizmoManager;
}
 
+(id)allocWithZone:(NSZone *)zone{
    return [[self sharedManager] retain];
}
 
-(id)copyWithZone:(NSZone *)zone{
    return self;
}

-(id)mutableCopyWithZone:(NSZone *)zone{
    return self;
}
 
-(id)retain{
    return self;
}
 
-(NSUInteger)retainCount{
    return NSUIntegerMax;  //象征一个对象不能被释放
}
 
-(void)release{
    //什么都不做
}
 
-(id)autorelease{
    return self;
}

-(void)dealloc{
        [xxx release];
if(sharedGizmoManager != nil){
 [sharedGizmoManager release];
 sharedGizmoManager = nil;
}
[super dealloc];
}

3.说明:
(1)我们重写了release方法,并且什么都没做,所以我们就不能手动控制静态实例的释放了。
(2)为了保险起见,最好重写dealloc方法,类似于上面的实现,回收全局变量内存,包含静态实例。因为用户不能够主动调用dealloc方法,只有系统能够调用。

三、深度分析:静态局部变量和静态全局变量

1.静态局部变量:变量使用静态存储方式,它具有以下特点:
(1)静态局部变量在函数内定义,但不象局部变量那样,当调用时就存在,退出函数时就消失。静态局部变量始终存在着,也就是说它的生存期为整个源程序。
(2)静态局部变量的生存期虽然为整个源程序,但是其作用域仍与局部变量相同,即只能在定义该变量的函数内使用该变量。退出该函数后, 尽管该变量还继续存在,但不能使用它。
(3)允许对类静态局部量赋初值。若未赋以初值,则由系统局部赋值。数值型变量局部赋初值0,字符型变量赋空字符。
(4)当多次调用一个函数且要求在调用之间保留某些变量的值,但是又不想让别的函数访问这个变量,可考虑采用静态局部变量。

2.静态全局变量:
(1)全局变量前加static就构成了静态的全局变量。全局变量本身就是静态存储方式, 静态全局变量当然也是静态存储方式。 
(2)这两者在存储方式上并无不同。这两者的区别:虽然非静态全局变量的作用域是整个源程序, 但是当一个源程序由多个源文件组成时,非静态的全局变量在各个源文件中都是有效的。 而静态全局变量只在定义该变量的源文件内有效。
(3)把局部变量改变为静态局部变量后是改变了它的存储方式,即改变了它的生存期;把全局变量改变为静态全局变量后是改变了它的作用域, 限制了它的使用范围。

3.静态变量只是改变了变量的生存期和作用域,但是类似于全局变量,也是要在合适的地方控制静态变量的释放,控制其内存。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值