0

作为objective-c的菜鸟,我刚刚在一个无法解释原因的类中遇到了对象所有权问题。

假设我有一个类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 ninja能否告诉我两个片段之间的区别以及原因?

4

1 回答 1

2

在第一种情况下,您修改一个对象:更改点中x, 。y

在第二种情况下,您创建一个新字符串,并用phoneObject. 您没有修改字符串本身(无论如何您都不能修改 -NSString是不可变的)。这意味着您提供给地址卡的原始字符串仍然存在并且仍然有效,因此地址卡仍然使用该字符串。如果你想让它使用新的,你需要告诉它,把:

addressCard1.phone = phoneObject;

重新分配后再次phoneObject

于 2013-05-06T04:54:46.047 回答