2011年7月19日 星期二

Object-C 進階學習( Class level access )

        當你想計算一個物件被 instance 幾次時,通常有 class level variables 以及 class level functions 是件方便的事。

  • ClassA.h
    #import <Foundation/NSObject.h>
    
    static int count;
    
    @interface ClassA: NSObject
    +(int) initCount;
    +(void) initialize;
    @end
  • ClassA.m
    #import "ClassA.h"
    
    @implementation ClassA
    -(id) init {
        self = [super init];
        count++;
        return self;
    }
    
    +(int) initCount {
        return count;
    }
    
    +(void) initialize {
        count = 0;
    }
    @end
  • main.m
    #import "ClassA.h"
    #import <stdio.h>
    
    int main( int argc, const char *argv[] ) {
        ClassA *c1 = [[ClassA alloc] init];
        ClassA *c2 = [[ClassA alloc] init];
    
        // print count
        printf( "ClassA count: %i\n", [ClassA initCount] );
        
        ClassA *c3 = [[ClassA alloc] init];
    
        // print count again
        printf( "ClassA count: %i\n", [ClassA initCount] );
    
        [c1 release];
        [c2 release];
        [c3 release];
        
        return 0;
    }
  • output
    ClassA count: 2
    ClassA count: 3
  • static int count = 0; 這是 class variable 宣告的方式。其實這種變數擺在這裡並不理想,比較好的解法是像 Java 實作 static class variables 的方法。然而,它確實能用。
  • +(int) initCount; 這是回傳 count 值的實際 method。請注意這細微的差別!這裡在 type 前面不用減號 - 而改用加號 +。加號 + 表示這是一個 class level function。(譯注:許多文件中,class level functions 被稱為 class functions 或 class method)
  • 存取這個變數跟存取一般成員變數沒有兩樣,就像 ClassA 中的 count++ 用法。
  • +(void) initialize method is 在 Objective-C 開始執行你的程式時被呼叫,而且它也被每個 class 呼叫。這是初始化像我們的 count 這類 class level variables 的好地方。

沒有留言:

張貼留言