rp如何做网站,保姆seo教程,新东方英语培训机构官网,重庆造价信息网官网首页一、要点#xff1a;1.当在应用程序中只需要有类的一个实例#xff0c;并且可以被其它对象轻松的访问的时候#xff0c;可以使用单例类。2.首先需要声明一个静态的类的实例变量#xff0c;并初始化为nil。应该将该实例变量声明在类的实现文件中#xff0c;表示变量仅在该实…一、要点1.当在应用程序中只需要有类的一个实例并且可以被其它对象轻松的访问的时候可以使用单例类。2.首先需要声明一个静态的类的实例变量并初始化为nil。应该将该实例变量声明在类的实现文件中表示变量仅在该实现文件中有效。3.添加工厂方法用于创建并返回单例类的实例在需要线程安全的情况下需要添加同步代码。4.为了防止用户调用alloc等方法创建或者做其它影响生命周期的操作我们需要重载一些方法。二、具体实现实例如下(苹果推荐实现)1.头文件interface MyGizmoClass : NSObject(MyGizmoClass*)sharedManager;end2.实现文件#import MyGizmoClass.hstatic 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.静态变量只是改变了变量的生存期和作用域但是类似于全局变量也是要在合适的地方控制静态变量的释放控制其内存。