0

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

誰でも理由を説明できますか?私は自分自身を使用しているかどうかという印象を受けています。またはいいえ、同じインスタンス プロパティにアクセスして値を割り当てているため、出力は変更されません。

4

1 に答える 1

1

私はセルフを使っているかどうかという印象を受けています。いいえ、同じインスタンス プロパティにアクセスして値を割り当てています。

はい、同じインスタンス変数ですが、同じ方法ではありません。を使用することで、プロパティで指定した をself.name実装しているセッター メソッドを呼び出しています。copy逆に、インスタンス変数を直接設定すると、コピーされないため、変更可能な文字列が変更されると、どこでも変更されます。

したがって、self.この場合に使用する代替手段は次のとおりです。

Name = [name copy];

これは、プロパティ定義があなたがやろうとしていることを尊重するからです。

于 2013-11-03T19:17:52.720 に答える