你好,歡迎來到IOS教程網

 Ios教程網 >> IOS訊息 >> 關於IOS >> iOS設計模式之單例模式

iOS設計模式之單例模式

編輯:關於IOS
單例模式:總是返回自己的同一個實例,它提供了對類的對象所提供的資源的全局訪問點,並且返回的實例只能被實例化一次.
單例設計模式設計需要考慮的兩個問題:
(1) :發起調用的對象不能以其他分配方式實例化單例對象,否則,就有可能創建單例類的多個實例
(2) :對單例對象實例化的限制應該與引用計數內存模型共存.

Singleton.h
#import <Foundation/Foundation.h>

@interface Singleton : NSObject

+(Singleton *) sharedInstance;

@end

Singleton.m
#import "Singleton.h"

@implementation Singleton

static Singleton *sharedSingleton = nil;

+(Singleton *) sharedInstance{
    
    if (sharedSingleton == nil) {
        //sharedSingleton = [[Singleton alloc] init];
        //     --------->>>>>(1)
        //sharedSingleton = [[super allocWithZone:NULL] init];
        /*
            這裡使用 super而不適用self的原因是self已經重載了allocWithZone方法
            所以通過調用父類的方法,實現內存的分配
            其實allocWithZone方法內部調用的是NSAllocateObject方法
        */
        //     --------->>>>>(2)
        sharedSingleton = [NSAllocateObject([self class], 0, NULL) init];
        /*
            第一個參數是 類的類型
            第二個參數是 用於索引的實例變量的額外字節數,總是 0
            第三個參數是 用於指定內存中分配的區域,一般為NULL,表示為默認區域
            這裡不適用(1)而使用(2)的原因是處理不管是實例化Singleton還是子類,都適用
         */
    }
    return sharedSingleton;
}


/*
    調用類的allocWithZone傳入NSZone參數,為即將產生的新對象分配空間
    重載的目的是當使用對象的alloc方法時不會產生新的實例
    因為 alloc方法其實調用的就是 allocWithZone:NULL方法,防止因 alloc而產生其他的實例
 
 */
+(id) allocWithZone:(struct _NSZone *)zone{

    return [[self sharedInstance] retain];
}


/*
    這裡重載copyWithZone的目的,是防止使用 copy 方法時產生其他的實例
 */
-(id) copyWithZone:(NSZone *)zone{
    
    return self;

}

-(id) retain{
    
    return self;
}

-(NSUInteger) retainCount{
    
    return NSUIntegerMax;
}

-(void) release{
    
    //什麼也不做

}

-(id) autorelease{
    
    return self;
}

@end

  1. 上一頁:
  2. 下一頁:
蘋果刷機越獄教程| IOS教程問題解答| IOS技巧綜合| IOS7技巧| IOS8教程
Copyright © Ios教程網 All Rights Reserved