作爲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告訴我兩個片段之間有什麼區別,這是什麼原因?