2013-05-06 79 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后再次。