OC學習篇之---單例模式 分類: IOS 2014-12-14 20:42 1498人閱讀 評論(2) 收藏

在以前的一片文章中介紹了對象的拷貝相關知識:http://blog.csdn.net/jiangwei0910410003/article/details/41926531,今天咱們來看一下OC中的單例模式,單例模式在設計模式中用的多是最多的一種了,並且也是最簡單的一種java

實現單例模式有三個條件設計模式

一、類的構造方法是私有的學習

二、類提供一個類方法用於產生對象測試

三、類中有一個私有的本身對象spa


針對於這三個條件,OC中都是能夠作到的.net

一、類的構造方法是私有的設計

咱們只須要重寫allocWithZone方法,讓初始化操做只執行一次指針

二、類提供一個類方法產生對象code

這個能夠直接定義一個類方法對象

三、類中有一個私有的本身對象

咱們能夠在.m文件中定義一個屬性便可


下面來看代碼:

AdressBook.h

//
//  AdressBook.h
//  35_Singleton
//
//  Created by jiangwei on 14-10-13.
//  Copyright (c) 2014年 jiangwei. All rights reserved.
//

#import <Foundation/Foundation.h>

//設計單利類的目的,限制這個類只能建立一個對象

//構造方法爲私有的
//保存一個全局的static變量
@interface AdressBook : NSObject

+ (AdressBook *)shareInstance;

@end
在.h文件中提供了一個類方法,用於產生對象的


AdressBook.m

//
//  AdressBook.m
//  35_Singleton
//
//  Created by jiangwei on 14-10-13.
//  Copyright (c) 2014年 jiangwei. All rights reserved.
//

#import "AdressBook.h"

static AdressBook *instance = nil;//不能讓外部訪問,同時放在靜態塊中的

@implementation AdressBook

+ (AdressBook *)shareInstance{
    if(instance == nil){
        instance = [[AdressBook alloc] init];
    }
    return instance;
}

//限制方法,類只能初始化一次
//alloc的時候調用
+ (id) allocWithZone:(struct _NSZone *)zone{
    if(instance == nil){
        instance = [super allocWithZone:zone];
    }
    return instance;
}

//拷貝方法
- (id)copyWithZone:(NSZone *)zone{
    return instance;
}

//須要重寫release方法,不能讓其引用+1
- (id)retain{
    return self;
}

//須要重寫release方法,不能讓其引用-1
- (oneway void)release{
    //do Nothing...
}

- (id)autorelease{
    return self;
}

@end


咱們定義了一個static類型的對象

static AdressBook *instance = nil;//不能讓外部訪問,同時放在靜態塊中的


提供一個獲取單實例的類方法

+ (AdressBook *)shareInstance{
    if(instance == nil){
        instance = [[AdressBook alloc] init];
    }
    return instance;
}

重寫allocWithZone方法,讓初始化只作一次
//限制方法,類只能初始化一次
//alloc的時候調用
+ (id) allocWithZone:(struct _NSZone *)zone{
    if(instance == nil){
        instance = [super allocWithZone:zone];
    }
    return instance;
}

還有其餘方法也是須要重寫的

//拷貝方法
- (id)copyWithZone:(NSZone *)zone{
    return instance;
}

//須要重寫release方法,不能讓其引用+1
- (id)retain{
    return self;
}

//須要重寫release方法,不能讓其引用-1
- (oneway void)release{
    //do Nothing...
}

- (id)autorelease{
    return self;
}
拷貝方法只能返回當前的單實例

retain和release方法不能進行引用的+1和-1操做


測試代碼

main.m

//
//  main.m
//  35_Singleton
//
//  Created by jiangwei on 14-10-13.
//  Copyright (c) 2014年 jiangwei. All rights reserved.
//

#import <Foundation/Foundation.h>

#import "AdressBook.h"

//單利模式
int main(int argc, const char * argv[]) {
    @autoreleasepool {
        
        AdressBook *book1 = [AdressBook shareInstance];
        AdressBook *book2 = [AdressBook shareInstance];
        
        NSLog(@"%@",book1);
        NSLog(@"%@",book2);
        
    }
    return 0;
}
兩個指針指向的是同一個對象


總結

這一篇文章主要介紹了OC中的單例模式,同時咱們OC學習篇的系列章程也就結束了,固然這些並不表明OC中全部的內容,還有不少其餘內容,咱們只有後面慢慢的去使用他纔會愈來愈瞭解。

相關文章
相關標籤/搜索