請輸入您的回答實例方法和類方法的區(qū)別:實例方法需要創(chuàng)建對象后,由該對象調用,也就是只能被對象使用的方法。類方法,也就是類自身可以調用的方法。優(yōu)缺點以及使用頻率這個不太好說一般使用類方法的地方都是為了調用簡單,并且內存占用少,因為它不需要n

創(chuàng)新互聯(lián)堅持“要么做到,要么別承諾”的工作理念,服務領域包括:網站建設、網站制作、企業(yè)官網、英文網站、手機端網站、網站推廣等服務,滿足客戶于互聯(lián)網時代的大姚網站設計、移動媒體設計的需求,幫助企業(yè)找到有效的互聯(lián)網解決方案。努力成為您成熟可靠的網絡建設合作伙伴!
為你解答。
第一、基本概念
單例模式是一種常用的軟件設計模式。在它的核心結構中只包含一個被稱為單例類的特殊類。通過單例模式可以保證系統(tǒng)中一個類只有一個實例而且該實例易于外界訪問。
第二、在IOS中使用單例模式的情況
1.如果說創(chuàng)建一個對象會耗費很多系統(tǒng)資源,那么此時采用單例模式,因為只需要一個實例,會節(jié)省alloc的時間
2.在IOS開發(fā)中,如果很多模塊都要使用同一個變量,此時如果把該變量放入單例類,則所有訪問該變量的調用變得很容易,否則,只能通過一個模塊傳遞給另外一個模塊,這樣增加了風險和復雜度
第三、創(chuàng)建單例模式的基本步驟
1.聲明一個單例對象的靜態(tài)實例,并初始化為nil
2.聲明一個類的工廠方法,生成一個該類的實例,并且只會生成一個
3.覆蓋allcoWithZone方法,確保用戶在alloc 時,不會產生一個多余的對象
4.實現(xiàn)NSCopying協(xié)議,覆蓋release,autorelease,retain,retainCount方法,以確保只有一個實例化對象
5.在多線程的環(huán)境中,注意使用@synchronized關鍵字
[cpp] view plaincopyprint?
//
// UserContext.h
// SingleDemo
//
// Created by andyyang on 9/30/13.
// Copyright (c) 2013 andyyang. All rights reserved.
//
#import Foundation/Foundation.h
@interface UserContext : NSObject
@property (nonatomic,retain) NSString *username;
@property(nonatomic,retain)NSString *email;
+(id)sharedUserDefault;
@end
[cpp] view plaincopyprint?
//
// UserContext.m
// SingleDemo
//
// Created by andyyang on 9/30/13.
// Copyright (c) 2013 andyyang. All rights reserved.
//
#import "UserContext.h"
static UserContext *singleInstance=nil;
@implementation UserContext
+(id)sharedUserDefault
{
if(singleInstance==nil)
{
@synchronized(self)
{
if(singleInstance==nil)
{
singleInstance=[[[self class] alloc] init];
}
}
}
return singleInstance;
}
+ (id)allocWithZone:(NSZone *)zone;
{
NSLog(@"HELLO");
if(singleInstance==nil)
{
singleInstance=[super allocWithZone:zone];
}
return singleInstance;
}
-(id)copyWithZone:(NSZone *)zone
{
NSLog(@"hello");
return singleInstance;
}
-(id)retain
{
return singleInstance;
}
- (oneway void)release
{
}
- (id)autorelease
{
return singleInstance;
}
- (NSUInteger)retainCount
{
return UINT_MAX;
}@end
[cpp] view plaincopyprint?
#import Foundation/Foundation.h
#import "UserContext.h"
int main(int argc, const char * argv[])
{
@autoreleasepool {
UserContext *userContext1=[UserContext sharedUserDefault];
UserContext *userContext2=[UserContext sharedUserDefault];
UserContext *userContext3=[[UserContext alloc] init];
UserContext *userContext4=[userContext1 copy];
// insert code here...
NSLog(@"Hello, World!");
}
return 0;
}
在開發(fā)中我們可以利用ios提供的方法來實現(xiàn)單例模式:
SYNTHESIZE_SINGLETON_FOR_CLASS(MyClassName);
將該語句置于@implementation MyClassName聲明后,這樣你的類自動會變成單例。
內容來自于richard_如風的博客。
一、靜態(tài)指針方式(單線程模式單例)
二、多線程加鎖單例
三、單例的健壯性
由于水平有限,難免出現(xiàn)紕漏,如有問題還請不吝賜教。
在數(shù)學和邏輯學中,單例定義為” 有且僅有一個元素的集合 “,在無論什么情況下,獲取到的都是同一個值。在程序中,單例模式保證一個類僅有一個實例,并提供一個訪問它的全局訪問點。這個方法應該是類方法,阻止所有想要生成對象的訪問,避免一個全局使用的類頻繁地創(chuàng)建和銷毀。
static uniqueInstance 是 Singleton 中的唯一實例, static sharedInstance 將它返回給客戶端。通常, shareInstance 會檢查 uniqueInstance 是否已經被實例化,如果沒有,會生成一個實例然后返回 uniqueInstance 。
沒有接口,不能繼承,與單一職責原則沖突,一個類應該只關心內部邏輯,而不關心外面怎么樣來實例化。
只要應用程序需要集中式的類來協(xié)調其服務,這個類就應該生成單一的實例,而不是多個實例。
之前創(chuàng)建單例是使用下面的方式:
這種方式創(chuàng)建的單例,如果外部使用了alloc方法來創(chuàng)建實例,或者copy方法拷貝了單例實例,那么就無法確保對象的唯一性,因此需要重寫allocWithZone:和copyWithZone:方法來規(guī)避外部創(chuàng)建多個單例對象。
說明:
1.在調用alloc方法時,OC內部會調用allocWithZone:這個方法來申請內存.
2.NSObject雖然有copy 和 mutableCopy方法,但是并沒有實現(xiàn),需要在子類中遵循NSCopying協(xié)議,即實現(xiàn)copyWithZone:方法.
在iOS OC中,一般我們都是用官方推薦的寫法來寫單例:GCD方式單例
URLManager* a = [URLManager sharedInstance];
接下來,可以用 a 這個單例來干很多事情了,看起來沒有問題。在很多實際的項目中,很多人也的確是這么做的。
可是,誰能保證所有人都會使用 sharedInstance 方法來創(chuàng)建對象?而一旦有人用 alloc,new 等來創(chuàng)建對象,這就不是單例了。
例如:
查看 a、b、c :
可以看到, a、b、c 不是同一個對象,而所謂單例,就是不管我用何種方法創(chuàng)建對象,都必須是同一個 。
所以,單例模式,絕不是一個 sharedInstance 就夠了。
解決方案 一 、
那么如何避免這種問題呢?我們知道:
在對象創(chuàng)建的時候,無論是 alloc 還是 new,都會調用到 allocWithZone: 方法;
使用拷貝創(chuàng)建對象時,會調用 copyWithZone:,mutableCopyWithZone:方法;
那么,重寫這些方法,就可以讓創(chuàng)建的對象唯一。
再運行,看一看a、b、c:
都是同一個對象!大功告成!
解決方案 二 、
此外,還有一種方法,就是直接禁用掉 alloc、new 、copy等方法:
如此,在調用這些方法時就會報錯,提示使用 sharedInstance 方法:
以此,也可以達到單例模式的要求,始終只有一個對象。
當前名稱:ios開發(fā)單例,ios 單例的優(yōu)缺點
URL鏈接:http://chinadenli.net/article35/dsidcsi.html
成都網站建設公司_創(chuàng)新互聯(lián),為您提供商城網站、面包屑導航、、網站設計、外貿網站建設、建站公司
聲明:本網站發(fā)布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯(lián)