Objective-C の学習を始めたばかりで、出力に混乱しています。インスタンス メソッド内のプロパティでの self の使用法を理解しようとしています。Objective-C インスタンス メソッドで self を使用してプロパティを設定すると、self を使用せずにプロパティを設定すると、異なる結果が表示されるのはなぜですか?
プロパティを copy 属性で宣言し、プロパティへの割り当てが直接参照ではなくコピーになると仮定しました。
#import <Foundation/Foundation.h>
@interface AddressCard : NSObject
//using a copy attribute
@property (copy, nonatomic) NSString *Name, *Email;
-(void) setName:(NSString *) name andEmail: (NSString *) email;
-(void) print;
@end
setName インスタンス メソッドの実装では、self.Name と self.Email を使用してプロパティ値を設定しています。
@implementation AddressCard
@synthesize Name;
@synthesize Email;
-(void) setName:(NSString *) name andEmail:(NSString *)email
{
self.Name = name;
self.Email = email;
}
-(void) print
{
NSLog(@"Name : %@ , Email: %@", Name, Email);
}
@end
メイン プログラムでは、NSMutableString を setName インスタンス メソッドに渡し、print を呼び出し、名前の変更可能な文字列変数を変更して再度 print を呼び出します。
#import <Foundation/Foundation.h>
#import "AddressCard.h"
int main(int argc, const char * argv[])
{
@autoreleasepool {
AddressCard *card = [[AddressCard alloc] init];
//declaring local mutable string variables to use them for passing as parameters
//to setName instance method
NSMutableString *name = [NSMutableString stringWithString: @"John Doe"];
NSMutableString *email = [NSMutableString stringWithString: @"john.doe@email.com"];
//passing the name and email mutables as parameters
[card setName: name andEmail: email];
[card print];
//Modifying name variable which previously passed as parameter to setName method
[name appendString: @" MODIFIED"];
NSLog(@"Output Should Not Change");
//Print again
[card print];
}
return 0;
}
メイン プログラムで名前変更可能な文字列変数を変更しても、2 行目の結果には影響しません。
名前:ジョン・ドウ、電子メール:john.doe@email.com
出力を変更しないでください
名前:ジョン・ドウ、電子メール:john.doe@email.com
しかし、自己を削除してsetNameインスタンスメソッドを変更し、プロパティNameとEmailを直接設定すると、同じ出力が得られません。
-(void) setName:(NSString *) name andEmail:(NSString *)email
{
// self.Name = name
Name = name;
// self.Email = email;
Email = email;
}
メイン プログラムの変更可能な名前変数への変更は、出力に反映されます。
名前:ジョン・ドウ、電子メール:john.doe@email.com
出力を変更しないでください
名前: John Doe 変更済み、電子メール: john.doe@email.com
誰でも理由を説明できますか?私は自分自身を使用しているかどうかという印象を受けています。またはいいえ、同じインスタンス プロパティにアクセスして値を割り当てているため、出力は変更されません。