Viewmvc view controllerr的单例被卡死,求教

21ic官方微信 -->
iOS单例模式的实现
&单例是指静态分配的实例,而 iphone sdk 中全是这种实例,例如
[UIApplication sharedApplication] 返回一个指向代表应用程序的单例对象的指针。[UIDevice
currentDevice] 获取一个代表所有使用硬件平台的对象。
将类方法与单例相结合,便可以在程序的任何地方访问静态实例,而无需使用指向对象的指针或保存它的实例变量。创建类的唯一实例(普通单例)的函数示例:
//在很多时候,我们使用某个类的唯一实例。最常见的就是一个程序的主类,以下是以名为 RootViewController 创建的一个单例函数:
static RootViewController *sharedRootController =
+(RootViewController *) sharedController{
@synchronized(self)
if (sharedRootController == nil)
sharedRootController = [[[self alloc] init] autorelease];
return sharedRootC
+(id) allocWithZone:(NSZone *)zone
@synchronized(self)
if (sharedRootController == nil)
sharedRootController = [super allocWithZone:zone];
return sharedRootC
代码说明:
1、synchronized 这个主要是考虑多线程的程序,这个指令可以将{ }
内的代码限制在一个线程执行,如果某个线程没有执行完,其他的线程如果需要执行就得等着。
2、网上搜索的代码,好像有一个没有加入 autorelease,我觉得应该需要加。因为如果调用的函数没有release就麻烦了(我觉得,iOS
上的程序,对于创建用于函数返回值的,都应该考虑 autorelease)。
3、allocWithZone 这个是重载的,因为这个是从制定的内存区域读取信息创建实例,所以如果需要的单例已经有了,就需要禁止修改当前单例,所以返回
“如果把这几百美元花到自己的健康上,那才是明智的。”这是美国共和党议员Jason Chaffetz近日在接受采访时的惊人语录,他认为iPhone在现在的低收入人群当中造成了“选择困难”。......关键字:
据国外媒体报道称,在去年的苹果春季特别发布会上,一款名为“Liam”的机器人首次亮相。从苹果当时公布的短片来看,这个巨型机器人拥有29只独立的、功能不同的机械手,其主要工作则是将返厂的、损坏的iPhone进行快速拆解,并将其中的贵金属进行有......关键字:
上周意法半导体(STMicroelectronics)晶圆厂失火,最新款iPhone的生产进度恐怕将受连累。......关键字:
由于升级乏力,苹果手机在中国市场的销量大幅下滑,这也殃及了其市场份额。据外媒最新消息,机构最新报告显示,苹果手机在中国的份额大幅下滑了8.4个百分点,仅剩下16.6%。......关键字:
有关苹果十年版手机,之前媒体比较一致的报道是将会采用5.8英寸的曲面屏,这也是苹果历史上第一次使用曲面屏。然而最近多家媒体和分析师披露的信息显示,苹果将作出重大调整,改回传统的平面屏幕。......关键字:
我 要 评 论
大家都爱看
回顾已经过去的2016年,嵌入式技术和物联网发展迅速,嵌入式技术在巩固传统应用的基础上,探索新兴市场,
物联网(IoT)是其中最具有广泛性的应用市场。在以创新推动的新技术…
日前,IDC最新发布了《IDCFutureScape:全球智慧城市2017年预测&&中国启示》的报告。报告详尽地介绍并解读了IDC对中国智慧城市市场未来三年的十大预测,包括每…
011年,指纹传感器首次出现在摩托罗拉Atrix手机上。短短几年时间,它已经成为了智能手机的标配。无论是高端旗舰机,还是廉价入门机,我们都能看到它的身影。与此同时,手机…
随着3D打印技术的不断发展,从航空航天到汽车行业,使用3D打印机生产按需小系列零件已经成为一个发展趋势。其正在影响着一个价值4000亿美元的备件制造和物流市场的形状。这些变化不是20年,甚至…
可以对折的折叠式智能手机发展更进一步!有&韩国麻省理工学院&之称的
KAIST(韩国技术研究院),研发出新型塑料薄膜,和玻璃一样硬、又和塑料一样有弹性,预料…
业界早知道
03-2003-2003-2003-2003-2003-20
精读涨姿势
03-2309-0806-0802-1706-0810-16IOS、Objective-C中单例类与半单例类
& 在设计模式中有一个&单例模式&,对应的我们常常会设计&单例类&(或称单件类)。但在实际应用中,我们常常也需要使用&半单例&。下面我们具体谈谈单例和半单例,以及他们的用法和区别。
单例模式(singleton)顾名思义,就是只有一个实例。
作为对象的创建模式[GOF95], 单例模式确保某一个类只有一个实例,而且自行实例化并向整个提供这个实例。这个类称为单例类。
也就是说,对于一个单例类,不论实例化对象多少次,都只有一个对象实例,而且这个实例一定是一个全局的能被整个系统访问到。
下面是Objective-C中完整的单例类的实现:
Singleton.h
#import &Foundation/Foundation.h&
@interface Singleton : NSObject
+(id)shareI
Singleton.m
#import &Singleton.h&
static Singleton * instance =
@implementation Singleton
+(id)shareInstance
& & if(instance == nil)
& & & & instance = [[super allocWithZone:nil]init]; &//super 调用allocWithZone & & & & & &
+(id)allocWithZone:(NSZone *)zone
& & return [Singleton shareInstance]; &&
//可写可不写
- (id)init&
& & if (instance)&
& & self = [super init];
- (id)copyWithZone:(NSZone *)zone
-(id)retain
- (oneway void)release&
& & // Do nothing
- (id)autorelease&
- (NSUInteger)retainCount&
& & return NSUIntegerM
解释说明:
1.static Singleton * instance =
静态全局变量,始终指向实例化出的对象。
2.+(id)shareI
外界初始化得到单例类对象的唯一借口,这个类方法返回的就是instance,即类的一个对象,
如果instance为空,则实例化一个对象,如果不为空,则直接返回。这样保证了实例的唯一。
- (id)copyWithZone:(NSZone *)
这两个方法是为了防止外界拷贝造成多个实例,保证实例的唯一性。
因为只有一个实例对象,所以retain不能增加引用计数。
5.- (NSUInteger)retainC
因为只有一个实例对象,设置默认引用计数。这里是取的NSUinteger的最大值,当然也可以设置成1或其他值。
6.- (onewayvoid)
oneway void是用于多线程中,表示单向执行,不能&回滚&,即原子操作。
1.半单例不同于单例,它可以实例化多个对象。
2.在程序中系统要求能访问到这个类的当前对象实例。
比如说:我们对于一个ViewController,我们可以实例化多个。在ViewController中,我们给他添加了很多视图View。
这些View中,当与用户发生某个交互时,我们由需要向Controller发送消息,实现响应操作。那么,View必须能找到当前的ViewController。这时,我们可以将ViewController设置成一个半单例类。
以&翻书&程序为例:这里涉及到两个类LeavesViewController 和LeavesView
显然,我们是在LeavesViewController中添加多个LeavesView实现多页效果,
当判断出LeavesView翻到最后一页时,我们需要让LeavesViewController响应,跳到下一个Controller,其他场景视图。
LeavesViewController类为&半单例&:
LeavesViewController.h
#import &UIKit/UIKit.h&
#import &LeavesView.h&
@interface LeavesViewController : UIViewController &LeavesViewDataSource, LeavesViewDelegate&&
LeavesView *leavesV
@property(nonatomic,retain)LeavesView *leavesV
+ (id)shareI
- (void)goToP
LeavesViewController.m
#import &LeavesViewController.h&
#import &ASCcLevelOnePaperScene.h&
static LeavesViewController *leavesViewInstance =
@implementation LeavesViewController
@synthesize leavesV
- (id)init&
& & if (self = [super init])&
& & & & leavesView = [[LeavesView alloc] initWithFrame:CGRectZero];
& & & & leavesView.mode = UIInterfaceOrientationIsPortrait(self.interfaceOrientation) ? LeavesViewModeSinglePage : LeavesViewModeFacingP
& & & & leavesViewInstance = & & & //注意这里
- (void)dealloc&
& & [leavesView release];
& & leavesViewInstance = & & &//释放全局变量
& & [super dealloc];
+ (id)shareInstance
& & //NSAssert(leavesViewInstance!=nil,@&leavesViewInstance can not be nil!&);
& & if(leavesViewInstance == nil)
& & & & leavesViewInstance = [self init];
& & return leavesViewI
这里只展示了&半单例&的实现部分,关于Controller都有的ViewDidLoad等方法和其他相关实现方法,这里与&半单例&无关,不做展示
LeavesView只是一个普通的视图类。
当LeavesView判断到最后一页时:
if([self hasNextPage]==NO)
& & NSLog(@&最后一页!&);
& & [[LeavesViewController shareInstance] goToPlay];
[LeavesViewControllershareInstance]得到当前ViewController。再发送消息goToPlay,让ViewController响应。
(window.slotbydup=window.slotbydup || []).push({
id: '2467140',
container: s,
size: '1000,90',
display: 'inlay-fix'
(window.slotbydup=window.slotbydup || []).push({
id: '2467141',
container: s,
size: '1000,90',
display: 'inlay-fix'
(window.slotbydup=window.slotbydup || []).push({
id: '2467142',
container: s,
size: '1000,90',
display: 'inlay-fix'
(window.slotbydup=window.slotbydup || []).push({
id: '2467143',
container: s,
size: '1000,90',
display: 'inlay-fix'
(window.slotbydup=window.slotbydup || []).push({
id: '2467148',
container: s,
size: '1000,90',
display: 'inlay-fix'spring的controller默认是单例还是多例
spring的controller默认是单例还是多例
java的web工程

曾经面试的时候有面试官问我spring的controller是单例还是多例,结果我傻逼的回答当然是多例,要不然controller类中的非静态变量如何保证是线程安全的,这样想起似乎是对的,但是不知道(主要是我没看过spring的源码,不知道真正的内在意图)为什么spring的controller是单例的。
先看看spring的bean作用域有几种,分别有啥不同。
spring bean作用域有以下5个:
singleton:单例模式,当spring创建applicationContext容器的时候,spring会欲初始化所有的该作用域实例,加上lazy-init就可以避免预处理;
prototype:原型模式,每次通过getBean获取该bean就会新产生一个实例,创建后spring将不再对其管理;
====下面是在web项目下才用到的===
request:搞web的大家都应该明白request的域了吧,就是每次请求都新产生一个实例,和prototype不同就是创建后,接下来的管理,spring依然在监听
session:每次会话,同上
global session:全局的web域,类似于servlet中的application
好了,上面都说了spring的controller默认是单例,那很自然就是singleton了。
再看一个例子,看看单例会不会有我说的那种问题(就是类中定义的非静态变量线程安全问题),当然下面这个例子我是实验过的, 要不然也不敢发出来
为什么spring要默认是单例呢?原因有二:
1、为了性能。
2、不需要多例。
1、这个不用废话了,单例不用每次都new,当然快了。
2、不需要实例会让很多人迷惑,因为spring mvc官方也没明确说不可以多例。
& 我这里说不需要的原因是看开发者怎么用了,如果你给controller中定义很多的属性,那么单例肯定会出现竞争访问了。
& 因此,只要controller中不定义属性,那么单例完全是安全的。下面给个例子说明下:
默认单例的
com.lavasoft.demo.web.controller.lsh.ch5;
org.springframework.context.annotation.S
org.springframework.stereotype.C
org.springframework.ui.ModelM
org.springframework.web.bind.annotation.RequestM
@Controller
@RequestMapping(&/demo/lsh/ch5&)
class MultViewController {
&&&&privateintindex =
0;&&&&&&&&&
&&&&@RequestMapping(&/show&)
&&&&publicStringtoShow(ModelMap model) {
&&&&&&&&System.out.println(++i);
&&&&&&&&return&/lsh/ch5/show&;
&&&&@RequestMapping(&/test&)
&&&&publicStringtest() {
&&&&&&&&System.out.println(++i);
&&&&&&&&return&/lsh/ch5/test&;
改为多例的(就是在class上面加一个@Scope(&request&)):
从此可见,单例是不安全的,会导致属性重复使用。
最佳实践:
1、不要在controller中定义成员变量。
2、万一必须要定义一个非静态成员变量时候,则通过注解@Scope(&prototype&),将其设置为多例模式。
我的热门文章
即使是一小步也想与你分享

我要回帖

更多关于 ios自定义view 单例 的文章

 

随机推荐