2013年4月28日 星期日

Class variable in objective-c

在objective-c中沒有提到class variable,不過可以用static variable實現。

Toy.h

#import <Foundation/Foundation.h>
@interface Toy : NSObject
{
    NSString *name_;
}
@property (nonatomic,retain)NSString *name;
+(int)currentToyNumber;
@end


Toy.m
#import "Toy.h"

static int toyNumber;

@implementation Toy
@synthesize name = name_;
-(id)init
{
    self =[super init];
    if (self) {
        toyNumber++;
    }
    return self;
}
+(int)currentToyNumber
{
    return toyNumber;
}
-(void)dealloc
{
    toyNumber--;
}
@end


main.m
#import <Foundation/Foundation.h>
#import "Toy.h"
int main(int argc, const char * argv[])
{

    @autoreleasepool {
        //新增一個Toy
        Toy *toyA = [[Toy alloc]init];
        [toyA setName:@"Apple"];
        NSLog(@"Add toy, currentToyNumber: %d",[Toy currentToyNumber]);
        //再新增一個Toy
        Toy *toyB = [[Toy alloc]init];
        [toyB setName:@"Banana"];
        NSLog(@"Add another toy, currentToyNumber: %d",[Toy currentToyNumber]);
        //刪除一個Toy
        toyA = nil;
        NSLog(@"Delete apple, currentToyNumber: %d",[Toy currentToyNumber]);
        
    }
    return 0;
}

Output的結果如下:

Add toy, currentToyNumber: 1
Add another toy, currentToyNumber: 2
Delete apple, currentToyNumber: 1



用extern改寫,範例如下,其實是用全域變數,已經跟class variable含意不同了。
Toy.h
#import <Foundation/Foundation.h>
extern int currentToyNumber;

@interface Toy : NSObject
{
    
}
@end


Toy.m
#import "Toy.h"

@implementation Toy
-(id)init
{
    self = [super init];
    if (self) {
        currentToyNumber++;
    }
    return self;
}
-(void)dealloc
{
    currentToyNumber--;
}
@end

main
#import <Foundation/Foundation.h>
#import "Toy.h"


int currentToyNumber = 0;

int main(int argc, const char * argv[])
{

    @autoreleasepool {
        
        NSLog(@"CurrentToyNumber : %d",currentToyNumber);
        
        Toy *toyA = [[Toy alloc]init];
        NSLog(@"CurrentToyNumber : %d",currentToyNumber);
        
        Toy *toyB = [[Toy alloc]init];
        NSLog(@"CurrentToyNumber : %d",currentToyNumber);
        
        toyA = nil;
        
        NSLog(@"CurrentToyNumber : %d",currentToyNumber);
    }
    return 0;
}
輸出結果:
CurrentToyNumber : 0
CurrentToyNumber : 1
CurrentToyNumber : 2
CurrentToyNumber : 1

沒有留言: