Object C學習筆記10-靜態方法和靜態屬性

賀臣發表於2014-02-15

  在.NET中我們靜態使用的關鍵字static有著舉足輕重的作用,static 方法可以不用例項化類例項就可以直接呼叫,static 屬性也是如此。在Object C中也存在static關鍵字,今天的學習過程使用到了這個關鍵字,在這裡記錄一下static的使用。

  在Object C的語法中宣告後的static靜態變數在其他類中是不能通過類名直接訪問的,它的作用域只能是在宣告的這個.m檔案中 。不過可以呼叫這個類的方法間接的修改這個靜態變數的值。對於Object C中的類使用和定義在前面已經做過相應的記錄,可以檢視Object C學習筆記3-物件的使用和定義

 

  1. 靜態屬性

  Object C中靜態屬性的定義和.NET中的有點不一樣,先看看如下程式碼:

#import <Foundation/Foundation.h>
@interface Person : NSObject
{
    int age;
    NSString *name;
    static int totalCount;
    
}
@property int age;
@property NSString *name;

-(void) write;

+(void) hello;
@end
錯誤的static屬性定義

  以上程式碼定義 static int totalCount; 這樣在編譯器中編譯會報錯,這樣的程式碼編寫對於編譯器是不認可的。正確的定義放入如下:

#import <Foundation/Foundation.h>
@interface Person : NSObject
{
    int age;
    NSString *name;
}
@property int age;
@property NSString *name;

-(void) write;

+(void) hello;
@end
正確的static屬性定義-interface
#import "Person.h"

static int count;

@implementation Person

@synthesize age;
@synthesize name;


-(void) write
{
    NSLog(@"姓名:%@  年齡:%i",name,age);
}

+(void) hello
{
    count++;
    NSLog(@"static = %i",count);
}


@end
正確的static屬性定義-implementation

  static 屬性應該定義在implementation中,而且寫在implementation之外或者方法之中。以上程式碼是將static 屬性寫在implementation之外。

@autoreleasepool {
        for(int i=0;i<5;i++){
            [Person hello];
        }
    }


測試結果
2014-02-15 22:03:14.642 Object11[488:303] static = 1
2014-02-15 22:03:14.644 Object11[488:303] static = 2
2014-02-15 22:03:14.644 Object11[488:303] static = 3
2014-02-15 22:03:14.645 Object11[488:303] static = 4
2014-02-15 22:03:14.645 Object11[488:303] static = 5
測試程式碼和結果

  從以上程式碼可以看出,呼叫hello方法直接使用類名Person而非Person的例項,而且每次呼叫之後count都會+1.

 

  2. static屬性在方法中

  修改程式碼如下,將static屬性改到方法中。

#import "Person.h"



@implementation Person

@synthesize age;
@synthesize name;


-(void) write
{
    NSLog(@"姓名:%@  年齡:%i",name,age);
}

+(void) hello
{
    static int count;
    count++;
    NSLog(@"static = %i",count);
}
static 屬性在方法中

  使用如上方式和1中的效果一樣,static屬性是屬於類全域性的,看看測試程式碼就知道效果如何:

@autoreleasepool {
        for(int i=0;i<5;i++){
            [Person hello];
        }
    }


//測試結果
2014-02-15 22:12:04.681 Object11[528:303] static = 1
2014-02-15 22:12:04.683 Object11[528:303] static = 2
2014-02-15 22:12:04.684 Object11[528:303] static = 3
2014-02-15 22:12:04.685 Object11[528:303] static = 4
2014-02-15 22:12:04.685 Object11[528:303] static = 5
測試程式碼和結果

  效果和前面的是一樣的。下面再看看在例項方法中定義static 屬性看看效果如下,修改程式碼如下:

#import "Person.h"



@implementation Person

@synthesize age;
@synthesize name;


-(void) write
{
    static int myage=0;
    myage++;
    NSLog(@"年齡:%i",myage);
}

+(void) hello
{
    static int count;
    count++;
    NSLog(@"static = %i",count);
}
在例項方法中定義static屬性

  測試例項方法中的靜態屬性測試方法如下:

    @autoreleasepool {
        for(int i=0;i<5;i++){
            Person *p=[[Person alloc] init];
            p.name=[NSString stringWithFormat:@" %@ %i",@"object c",i];
            [p write];
        }
    }

//測試結果如下
2014-02-15 22:20:35.161 Object11[582:303] 姓名: object c 0  年齡:1
2014-02-15 22:20:35.163 Object11[582:303] 姓名: object c 1  年齡:2
2014-02-15 22:20:35.164 Object11[582:303] 姓名: object c 2  年齡:3
2014-02-15 22:20:35.164 Object11[582:303] 姓名: object c 3  年齡:4
2014-02-15 22:20:35.164 Object11[582:303] 姓名: object c 4  年齡:5
測試程式碼

  從以上測試程式碼可以看出,static 屬性定義到例項方法中同樣適用,在呼叫的迴圈過程中for不斷例項化新的例項,name屬性在發生變化,而count保留上次執行的結果,這也就是static的作用。

 

  3. 靜態方法

  在.NET中定義靜態方法也需要適用static 關鍵字,但是在Object C並非如此。在之前我們定義方法的時候都是如下格式:

  - (返回值型別) 方法名: 引數,... 

  適用靜態方法 就是將 "-" 改為 "+" 即可。

  +(void) hello; 在interface中定義如上方法簽名,而在implementation中實現這個方法。

  靜態方法的時候在上面的例子中已經提到過了,可詳細參考!

相關文章