2013年5月1日 星期三

objective-c function 根據參數類型,有不同的行為

在objective-c 函式中,如果傳入的是簡單型別或是常數,函式會自動複製一份傳入的參數,所以之後如果有更改原先的變數,物件內的成員不會受影響;反之如果傳入的不是簡單型別或是常數,函式只會將物件的成員指向同一個位置,如果有更改變數,物件內的成員也跟著變動,這樣解釋有點模糊,看個例子比較清楚。
//XYPoint為自訂的一個類別
@interface XYPoint : NSObject
{
    int x;
    int y;
}
@property int x, y;

-(void)setX:(int) xVal andY:(int) yVal;

@end

@implementation XYPoint

@synthesize x,y;

-(void)setX:(int)xVal andY:(int)yVal
{
    x = xVal;
    y = yVal;
}

@end


//主要的測試類別,成員包含自定類別XYPoint, NSMutableString, int
@interface Foo : NSObject
{
    XYPoint *o;
    NSMutableString *name;
    int X;
}
-(XYPoint *)o;
-(void)setO:(XYPoint *)pt;
-(NSMutableString *)name;
-(void)setName:(NSMutableString *)n;
-(int)X;
-(void)setX:(int)value;
@end

@implementation Foo

-(XYPoint *)o
{
    return o;
}
-(void)setO:(XYPoint *)pt
{
    o = pt;
}

-(NSMutableString *)name
{
    return name;
}
-(void)setName:(NSMutableString *)n
{
    name = n;
}
-(int)X
{
    return X;
}
-(void)setX:(int)value
{
    X = value;
}
@end


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

    @autoreleasepool {
        
        //先準備等一會要傳入Foo的變數
        XYPoint *myPoint = [[XYPoint alloc]init];
        NSMutableString *myName = [[NSMutableString alloc]initWithString:@"Jon"];
        [myPoint setX:100 andY:200];
        int myValue = 10;
        
        //建立一個Foo物件,將成員設定為上述的變數
        Foo *f = [[Foo alloc]init];
        f.o = myPoint;
        [f setName:myName];
        [f setX:myValue];

        NSLog(@"Before change myPoint, f.o.x : %d f.o.y : %d",f.o.x,f.o.y);
        NSLog(@"Before change myName, f.name : %@",f.name);
        NSLog(@"Before change myValue, f.X : %d",f.X);
        
        //更改這些變數,看看是否為影響f內的成員
        [myPoint setX:50 andY:50];
        [myName setString:@"Tom"];
        myValue = 5;

        NSLog(@"After change myPoint, f.o.x : %d f.o.y : %d",f.o.x,f.o.y);
        NSLog(@"After change myName, f.name : %@",f.name);
        NSLog(@"After change myValue, f.X : %d",f.X);
    }
    return 0;
}


結果如下:
Before change myPoint, f.o.x : 100 f.o.y : 200
Before change myName, f.name : Jon
Before change myValue, f.X : 10
After change myPoint, f.o.x : 50 f.o.y : 50
After change myName, f.name : Tom
After change myValue, f.X : 10

沒有留言: