2013-05-06 73 views
0

作爲objective-c中的noob,我剛剛遇到了一個無法解釋原因的類中的對象所有權問題。類對象的所有權目標c

假設我有一個名爲Point的類,它描述了一個帶有x,y的點。 一個名爲rectangle的類有一個類型爲Point的對象,它表示它的左下邊緣。隨着下面的實現

@implementation Rectangle { 
    Point *origin; 
} 
-(Point *) origin { 
    return origin; 
} 

-(void) setOrigin: (Point *) pt { 
    origin = pt; 
} 
@end 

現在我只需要實例化的矩形,分配其來源的指針,目標點

Rectangle *rectangle2 = [[Rectangle alloc] init]; 
Point *pt = [[Point alloc] init]; 
[pt setX:1 andY:2]; 
rectangle2.origin = pt; 
NSLog(@"Point's x= %i, y=%i",pt.x,pt.y); // result: Point's x=1,y=2 
NSLog(@"Rectangle's origin x= %i, y=%i",rectangle2.origin.x,rectangle2.origin.y); //Rectangle's origin x=1,y=2 

現在,如果我改變X,對象PT的Y(下面的代碼行),該rectangle2對象的原點也會隨之改變,因爲它沒有自己的對象,而不是僅僅指向其中PT指向

[pt setX:10 andY:12]; 
NSLog(@"Point's x= %i, y=%i",pt.x,pt.y); // result: Point's x=10,y=12 
NSLog(@"Rectangle's origin x= %i, y=%i",rectangle2.origin.x,rectangle2.origin.y); //Rectangle's origin x=10,y=12 

這是完全合乎邏輯的,沒有問題。

問題似乎在類似的情況下發生。 AddressCard類有類型的NSString的目的,

@implementation AddressCard{ 
    NSString *phone; 
} 

-(void) setPhone:(NSString *) p { 
    phone = p; 
} 

-(NSString *) name { 
    return name; 
} 
@end 

我實例AddressCard,分配一個NSString指針到它的電話對象。

AddressCard *addressCard1 = [[AddressCard alloc] init]; 
NSString *phoneObject = @"(111) 111 - 1111"; 
addressCard1.phone = phoneObject; 
NSLog(@"addressCard1 phone: %@",addressCard1.phone); // result: (111) 111 - 1111 
NSLog(@"phone object: %@",phoneObject); // result: (111) 111 - 1111 

但現在如果我改變phoneObject,addressCard1.phone不會,儘管這種方式改變我設置的電話對象AddressCard類(在類實現setPhone法)

phoneObject = [NSString stringWithString:@"PHONE IS CHANGED"]; 
NSLog(@"%@",phoneObject); //result : PHONE IS CHANGED 
NSLog(@"Phone after change in the AddressCard is: %@",addressCard1.phone); // result: (111) 111 - 1111 

莫非一些objective-c ninja告訴我兩個片段之間有什麼區別,這是什麼原因?

回答

2

在第一種情況下,您修改了一個對象:將x,y改爲,這一點。

在第二種情況下,您將創建一個新字符串,並使用phoneObject指向該字符串。你沒有修改字符串本身(而且你也不能 - NSString是不可改變的)。這意味着您給地址卡的原始字符串仍然存在並仍然有效,因此地址卡仍使用該字符串。如果你想讓它使用新的一個,你需要告訴它,把:

addressCard1.phone = phoneObject; 

重新分配phoneObject後再次。