1. ホーム
  2. objective-c

[解決済み] Objective-cの「インスタンス変数」と「プロパティ」は違うのですか?

2023-07-07 14:53:48

質問

Objective-cのインスタンス変数とプロパティは違うのでしょうか。

あまり自信がないのですが。私は、quot;property"は、アクセッサメソッドを持つインスタンス変数だと思うのですが、間違っているのでしょうか?

どのように解決するのですか?

プロパティとは、より抽象的な概念です。インスタンス変数は文字通り、構造体のスロットのような、単なるストレージスロットです。通常、他のオブジェクトがそれらに直接アクセスすることは想定されていません。一方、プロパティはオブジェクトの属性であり、アクセスすることができます(曖昧に聞こえますが、そうなっています)。通常、プロパティはインスタンス変数を返したり、設定したりしますが、いくつかのデータを使用することもできますし、全く使用しないこともできます。例えば

@interface Person : NSObject {
    NSString *name;
}

    @property(copy) NSString *name;
    @property(copy) NSString *firstName;
    @property(copy) NSString *lastName;
@end

@implementation Person
    @synthesize name;

    - (NSString *)firstName {
        [[name componentsSeparatedByString:@" "] objectAtIndex:0];
    }
    - (NSString *)lastName {
        [[name componentsSeparatedByString:@" "] lastObject];
    }
    - (NSString *)setFirstName:(NSString *)newName {
        NSArray *nameArray = [name componentsSeparatedByString:@" "];
        NSArray *newNameArray [[NSArray arrayWithObjects:newName, nil] arrayByAddingObjectsFromArray:[nameArray subarrayWithRange:NSMakeRange(1, [nameArray size]-1)]];
        self.name = [newNameArray componentsJoinedByString:@" "];
    }
    - (NSString *)setLastName:(NSString *)newName {
        NSArray *nameArray = [name componentsSeparatedByString:@" "];
        NSArray *newNameArray [[nameArray subarrayWithRange:NSMakeRange(0, [nameArray size]-2)] arrayByAddingObjectsFromArray:[NSArray arrayWithObjects:newName, nil]];
        self.name = [newNameArray componentsJoinedByString:@" "];
    }
@end

(注意: 上記のコードは、名前がすでに存在し、少なくとも 2 つの構成要素を持っていると仮定している点でバグがあります (たとえば、単なる "Gates" ではなく "Bill Gates" などです)。これらの仮定を修正すると、コードの実際のポイントが不明確になると思ったので、誰も無邪気にこれらの間違いを繰り返さないように、ここでそれを指摘しているだけです)。