2013-05-06 8 views
0

Будучи noob в объективе-c, я просто столкнулся с проблемой в собственности объекта в классе, который не может объяснить причину.Объект собственности объекта объекта c

Предположим, что у меня есть класс под названием Point, который описывает точку с x, y. Класс, называемый прямоугольником, имеет объект типа Point, который представляет его левый нижний край. С после внедрения

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

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

Теперь я просто экземпляр Rectangle, присвоить его происхождение указатель на объект точки

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 

Теперь, если я изменю х, у объекта пт (следующую строку кода), происхождение объекта rectangle2 будет меняться, как хорошо, потому что он не является владельцем его объекта, а не только указывает, где пт, указывающей на

[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 

Могли бы некоторые object-c ninja рассказывает мне, в чем разница между двумя фрагментами и причиной этого?

ответ

2

В первом случае изменения объекта: изменения в x, y, которые в ТОЧНО.

Во втором случае вы создаете новую строку и указываете на это с помощью phoneObject. Вы сами не изменили строку (и вы все равно не могли: NSString неизменен). Это означает, что исходная строка, которую вы указали на адресную карточку, все еще существует и по-прежнему действительна, поэтому адресная карта все еще использует эту строку. Если вы хотите использовать новый, вы должны сказать ему, положив:

addressCard1.phone = phoneObject; 

снова после переназначения phoneObject.

Смежные вопросы