2017-08-12 40 views
0

我有这个类:为什么NSString属性没有看到分配给它的NSMutableString的更改?

@interface XYZPerson : NSObject{ 

NSString *_myNonPropertyInstanceVariable; 
} 

@property NSString *firstName; 
@property NSString *lastName; 
@property NSDate *dateOfBirth; 
@property (readonly) NSString* fullName; 

@property (nonatomic)NSString* experimental; 

-(void)sayHello; 
- (void)saySomething:(NSString *)greeting; 
+(id)person; 

- (id)initWithFirstName:(NSString *)aFirstName lastName:(NSString *)aLastName 
      dateOfBirth:(NSDate *)aDOB; 
@end 

实现:

#import "XYZPerson.h" 

@implementation XYZPerson { 
    NSString *_myNonPropertyInstanceVariable2; 

} 
@synthesize experimental = _experimental; 


-(id)init{ 
    self = [self initWithFirst:@"John" andLastName:@"Doe"]; 

    return self; 
} 

-(id) initWithFirst:(NSString*)first andLastName:(NSString*)last{ 
    return [self initWithFirstName:first lastName:last dateOfBirth:nil]; 
} 

- (id)initWithFirstName:(NSString *)aFirstName lastName:(NSString *)aLastName 
      dateOfBirth:(NSDate *)aDOB{ 
    self = [super init]; 
    if(self){ 
     _firstName = aFirstName; 
     _lastName = aLastName; 
     _dateOfBirth = aDOB; 
    } 

    return self; 
} 

-(void)sayHello{ 
    NSString* greet = [NSString stringWithFormat:@"Hello, World! %@",self.fullName ]; 
    [self saySomething:greet]; 
} 


-(void)saySomething:(NSString *)greeting { 
    NSLog(@"%@", greeting); 
} 

+(id)person{ 
    return [[self alloc]init]; 
} 

-(NSString*)fullName{ 

    return [NSString stringWithFormat:@"%@ %@",_firstName,_lastName]; 
} 

-(void) setExperimental:(NSString *)anExperimental{ 
    _experimental = anExperimental; 
} 

-(NSString*) experimental{ 
    return @"Balls to you"; 
} 

在我的主要方法,我做的:

NSMutableString* firstName = [NSMutableString stringWithString:@"IntheBeggining"]; 
     NSString* secondName = @"MyLastName"; 
     XYZPerson* newP = [[XYZPerson alloc]initWithFirstName:firstName lastName:secondName dateOfBirth:nil]; 
     firstName = [NSMutableString stringWithFormat:@"Awesome"]; 
     [newP sayHello]; 

现在我期待的是,由于的firstName是一个可变的字符串,当我将它改为“Awesome”,它应该反映在sayHello调用中......但是输出结果是:

你好,世界! IntheBeggining MyLastName

它应该说“你好,世界!真棒MyLastName”..为什么NSMutableString *的新值没有反映在输出中?

回答

2

您不会更改最后一个代码段中第一行的可变字符串的内容。您只需更改参考firstName指向的地方。要更改内容使用setString:

[firstName setString:@"Awesome"]; 

这也会更改人的名字。

顺便说一句:如果属性的内容可以从维护类的外部改变,那么这不是一个好的设计。这是更好地使用复制的属性,这将可变字符串的内容复制到不可改变的字符串的任务:通过调用它的Set

@property (copy) NSString *firstName; 

可以更改XYZPerson的名字:

newP.firstName = @"Awesome"; 

这具有维护可以控制值的优点。假设您想将全名存储在新的(隐藏)属性中。如果班级以外的代码将firstName的值更改为setString:,则班级无法观察此更改并更新全名。如果你禁止分配可变字符串,你只需要覆盖setter来保持全名是最新的。

相关问题