在objective-c中作为noob,我在一个无法解释原因的类中遇到了对象所有权问题。
假设我有一个名为Point
的类来描述带有x,y的点。
名为rectangle的类具有类型为Point
的对象,表示其左下边缘。以下实施
@implementation Rectangle {
Point *origin;
}
-(Point *) origin {
return origin;
}
-(void) setOrigin: (Point *) pt {
origin = pt;
}
@end
现在我只是实例化Rectangle,为其原点指定一个指向Point
对象的指针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
现在,如果我改变对象pt的x,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忍者可以告诉我两个片段之间有什么区别,原因是什么?
答案 0 :(得分:2)
在第一种情况下,您修改了一个对象:更改在点的x
,y
。
在第二种情况下,您创建一个新字符串,并使用phoneObject
指向该字符串。你没有修改字符串本身(你无论如何都不能 - NSString
是不可变的)。这意味着您提供给地址卡的原始字符串仍然存在且仍然有效,因此地址卡仍然使用该字符串。如果你想让它使用新的,你需要告诉它,把:
addressCard1.phone = phoneObject;
重新分配phoneObject
后再次。