1.开发中如何使用单例 ios
为你解答。
第一、基本概念单例模式是一种常用的软件设计模式。在它的核心结构中只包含一个被称为单例类的特殊类。
通过单例模式可以保证系统中一个类只有一个实例而且该实例易于外界访问。第二、在IOS中使用单例模式的情况1.如果说创建一个对象会耗费很多系统资源,那么此时采用单例模式,因为只需要一个实例,会节省alloc的时间2.在IOS开发中,如果很多模块都要使用同一个变量,此时如果把该变量放入单例类,则所有访问该变量的调用变得很容易,否则,只能通过一个模块传递给另外一个模块,这样增加了风险和复杂度第三、创建单例模式的基本步骤1.声明一个单例对象的静态实例,并初始化为nil2.声明一个类的工厂方法,生成一个该类的实例,并且只会生成一个3.覆盖allcoWithZone方法,确保用户在alloc 时,不会产生一个多余的对象4.实现NSCopying协议,覆盖release,autorelease,retain,retainCount方法,以确保只有一个实例化对象5.在多线程的环境中,注意使用@synchronized关键字 [cpp] view plaincopyprint?// // UserContext.h // SingleDemo // // Created by andyyang on 9/30/13. // Copyright (c) 2013 andyyang. All rights reserved. // #import
NSLog(@"Hello, World!"); } return 0; } 在开发中我们可以利用ios提供的方法来实现单例模式:SYNTHESIZE_SINGLETON_FOR_CLASS(MyClassName);将该语句置于@implementation MyClassName声明后,这样你的类自动会变成单例。内容来自于richard_如风的博客。
2.ios 怎么将一个viewcontroller做成单例不被释放
+ (id)sharedViewController {
static MyManager *VC = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
VC = [[self alloc] init];
});
return VC;
}
不建议将控制器设置成单例,一般单例多继承于NSobject , 控制器写成单例是一件很危险的事情。你把控制器写成单例无非就是想获取相同的一个控制器对象,获取同一个控制器总有别的办法,不需要单例。
3.ios怎么实现singleton
Singleton模式经常来做应用程序级别的共享资源控制, 应该说这个模式的使用频率非常高, 现在来看看在Objective-C里面的实现方法.要实现一个Singleton Class, 至少需要做以下四个步骤:1. 为Singleton Object实现一个静态实例, 初始化, 然后设置成nil.2. 实现一个实例构造方法(通常命名为 sharedInstance 或者 sharedManager)检查上面声名的静态实例是否为nil, 如果是则新建并返回一个本类实例.3. 重写 allocWithZone: 方法来保证当其他人直接使用 alloc 和 init 试图获得一个新实例的时候不会产生一个新的实例.4. 适当的实现 copyWithZone:, release, retain, retainCount 和 autorelease.@interface MySingleton : NSObject { // 。
}+ (MySingleton *)sharedInstance;// Interface- (NSString *)helloWorld;@end#import "MySingleton.h"static MySingleton *sharedInstance = nil;@implementation MySingleton#pragma mark Singleton methods+ (MySingleton *)sharedInstance { @synchronized(self) { if (sharedInstance == nil) { sharedInstance = [[MySingleton alloc] init]; } } return sharedInstance;}+ (id)allocWithZone:(NSZone *)zone { @synchronized(self) { if (sharedInstance == nil) { sharedInstance = [super allocWithZone:zone]; return sharedInstance; // assignment and return on first allocation } } return nil; // on subsequent allocation attempts return nil}- (id)copyWithZone:(NSZone *)zone { return self;}- (id)retain { return self;}- (unsigned)retainCount { return UINT_MAX; // denotes an object that cannot be released}- (void)release { //do nothing}- (id)autorelease { return self;}#pragma mark -#pragma mark NSObject methods- (id)init { if (self = [super init]) { // 。 } return self;}- (void)dealloc { // 。
[super dealloc];}#pragma mark -#pragma mark Implementation- (NSString *)helloWorld { return @"Hello World!";}@end#import "MySingleton.h"// 。NSLog(@"Result for singleton method helloWorld: %@", [[MySingleton sharedInstance] helloWorld]);。
4.ios 单例设计模式 解决什么用
单例模式:在单例模式中,对活动的单例只有一个实例。
对单例类的所有实例化得到的都是相同的一个实例。这个模式也提供一个全局的接口来访问这个类的实例。
public class Singleton { //Fields private static Singleton instance; //Standard default Constructor protected Singleton(){}; //Static method for creating the single instance of the Constructor public static Singleton Instance(){ //initialize if not already done if(instance == null) instance = new Singleton(); //return the initialized instance of the Singleton Class return instance; } }public class Client { public static void main(String []args){ Singleton s1 = Singleton.Instance(); Singleton s2 = Singleton.Instance(); if(s1 == s2) System.out.println("The same instance"); } }单例模式的优点: 1。实例控制:单例模式防止其它对象对自己的实例化,确保所有的对象都访问一个实例。
2。伸缩性:因为由类自己来控制实例化进程,类就在改变实例化进程上有相应的伸缩性。
5.ios 程序启动时为什么重新创建单例类
[cpp] view plaincopy static AccountManager *DefaultManager = nil; + (AccountManager *)defaultManager { if (!DefaultManager) DefaultManager = [[self allocWithZone:NULL] init]; return DefaultManager; } 当然,在iOS4之后有了另外一种写法:[cpp] view plaincopy+ (AccountManager *)sharedManager { static AccountManager *sharedAccountManagerInstance = nil; static dispatch_once_t predicate; dispatch_once(&predicate, ^{ sharedAccountManagerInstance = [[self alloc] init]; }); return sharedAccountManagerInstance; } 该写法来自 objcolumnist,文中提到,该写法具有以下几个特性:1. 线程安全。
2. 满足静态分析器的要求。3. 兼容了ARC 然后我还有点好奇的是dispatch_once,这个函数,没见过啊。
于是就到官方的文档里找找看,是怎么说的。下面是官方文档介绍:dispatch_once Executes a block object once and only once for the lifetime of an application. void dispatch_once( dispatch_once_t *predicate, dispatch_block_t block); Parameters predicate A pointer to a dispatch_once_t structure that is used to test whether the block has completed or not.block The block object to execute once.Discussion This function is useful for initialization of global data (singletons) in an application. Always call this function before using or testing any variables that are initialized by the block.If called simultaneously from multiple threads, this function waits synchronously until the block has completed.The predicate must point to a variable stored in global or static scope. The result of using a predicate with automatic or dynamic storage is undefined.Availability Available in iOS 4.0 and later.Declared In dispatch/once.h 我们看到,该方法的作用就是执行且在整个程序的声明周期中,仅执行一次某一个block对象。
简直就是为单例而生的嘛。而且,有些我们需要在程序开头初始化的动作,如果为了保证其,仅执行一次,也可以放到这个dispatch_once来执行。
然后我们看到它需要一个断言来确定这个代码块是否执行,这个断言的指针要保存起来,相对于第一种方法而言,还需要多保存一个指针。方法简介中就说的很清楚了:对于在应用中创建一个初始化一个全局的数据对象(单例模式),这个函数很有用。
如果同时在多线程中调用它,这个函数将等待同步等待,直至该block调用结束。这个断言的指针必须要全局化的保存,或者放在静态区内。
使用存放在自动分配区域或者动态区域的断言,dispatch_once执行的结果是不可预知的。总结:1.这个方法可以在创建单例或者某些初始化动作时使用,以保证其唯一性。
2.该方法是线程安全的,所以请放心大胆的在子线程中使用。(前提是你的dispatch_once_t *predicate对象必须是全局或者静态对象。
这一点很重要,如果不能保证这一点,也就不能保证该方法只会被执行一次。)。
6.ios 怎么宏定义封装一个单例
#define SYNTHESIZE_SINGLETON_FOR_CLASS(classname) \\static classname *shared##classname = nil; \\+ (classname *)shared##classname \{ \@synchronized(self) \{ \if (shared##classname == nil) \{ \shared##classname = [self alloc] init]; \} \} \\return shared##classname; \} \\。
7.iOS中创建单例为什么使用static关键字,不用有什么影响
首先你要明白static 是在什么时候初始化的,其设计意图是是什么,单例 就是我们运行的当前虚拟机中有且只有一个需要的对象,不存在重复。
static 是给类静态成员变量使用的,属于类的属性,一般是一些常量之类的东西,从加载上来说对于类和对象之间,在类加载到内存时候静态成员变量就存在了,而对象还不存在,另外 静态方法只能调用静态方法和静态变量这个你也应该知道,如果全部搞成静态方法那么意味着其他成员变量都要是静态的,很不方便,如果一天不要单例了也不容易扩展,很麻烦。