2017-08-12 6 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は可変文字列であるため、私はそれを "素晴らしい"に変更すると、sayHelloの呼び出しに反映されるはずですが、出力は次のようになります。

こんにちは、世界! MyByining MyLastName

「Hello、World!Awesome MyLastName」と言っているはずです。なぜNSMutableString *の新しい値が出力に反映されませんでしたか?

答えて

2

最後のスニペットの最初の行の可変文字列の内容は変更しません。参照番号firstNameを指すように変更するだけです。コンテンツの使用setString:を変更するには:

[firstName setString:@"Awesome"]; 

これも、人の最初の名前を変更します。

ところで、プロパティの内容をクラスのメンテナンス外から変更することはできません。これは、割り当ての不変の文字列に可変文字列の内容をコピーしますこれ、コピーされたプロパティを使用することをお勧めします:

@property (copy) NSString *firstName; 

あなたは、そのセッターを呼び出すことによってXYZPersonの最初の名前を変更することができます。

newP.firstName = @"Awesome"; 

この維持が価値を支配することができるという利点があります。新しい(隠された)プロパティに完全な名前を格納するとします。クラス外のコードがfirstNameの値をsetString:に変更している場合、クラスはこの変更を観察してフルネームを更新する機会がありません。変更可能な文字列の割り当てを禁止する場合は、完全名を最新の状態に保つためにセッターを上書きする必要があります。

関連する問題