質問

Objective-Cプログラミングに侵入しながら、私が苦労してきたことの1つは、プロパティを操作する方法を理解することです。私はおそらく、私が慣れているスクリプト言語とは対照的に、適切なコーディング言語を使用しているので、ヘッダーファイルと実装ファイルの宣言を宣言することはやや混乱しています。

文字列があるとしましょう。その文字列にテキストを追加したいと思います。ヘッダーファイルで何を宣言しますか?これを適切に機能させるために実装ファイルで何をしますか?@propertyと@synthesizeとは何ですか?

役に立ちましたか?

解決

Objective-C 2.0の前の悪い昔は、インスタンス変数のゲッターとセッターを書くことが一般的でした

@interface Foo : NSObject
{
@private 
    id foo;
}
-(void) setFoo: (id) newFoo;
-(id) foo;
@end

@implementation Foo

// need dealloc to release foo too.

-(void) setFoo: (id) newFoo
{
    [newFoo retain];
    [foo release];
    foo = newFoo;
}

-(id) foo
{
   return foo;
}
@end

そして、それは単一のスレッド環境にあります。マルチスレッドアプリにはさらに多くのものが必要でした。

プロパティは、上記にきちんとした速記を提供します。 @Propertyは、インターフェイスの宣言の両方を置き換え、ゲッターとセッターのセマンティクスについてのより良いヒントを発信者に提供します。また、コンパイラが自動的にコードを生成するように、@synthesizeのアクセサを可能にすることもできます(あなたはしません 持ってる @synthisizeするには、必要に応じて独自の実装を提供できます)。上記のすべてを置き換えることができます

 @interface Foo : NSObject
{
@private 
    id foo;
}
@property (nonatomic, retain) id foo;
@end

@implementation Foo

// need dealloc to release foo too.

@synthesize foo; 
@end

これにより、かなり多くのタイピングが節約されますが、Setfoo:その新しい値を保持し、プロパティが安全ではないことをインターフェイスから見ることができます(設定するために また 取得)マルチスレッド環境(他のロックメカニズムなし)。

他のヒント

@property - アクセスおよびメモリ修飾子を備えたプロパティを宣言します。プロパティは、readonlyまたはreadwrite、非原子的または原子的(スレッドの安全性)、譲渡/保持/コピー管理を行うことができます。実際、タイガー時代に行ったように、シンプルなゲッターとセッターの方法を宣言することができますが、 @property 実装をチェックせずに、いつでもプロパティのすべての側面を特定するのに役立ちます。

@synthesize - GetterとSetterで複雑なジョブなしで単純なプロパティが必要な場合、ジョブを簡素化します。の定義に従ってデフォルトの実装を定義します @property.

ついに、文字列についてのあなたの質問。あなたが簡単なものを探しているなら、ここでプロパティは助けにはなりません、言いましょう myObj.string += "abc". 。それはObjective-Cスタイルではなく、財産の有無にかかわらず、あなたは次のようなことをします myObj.string = [[myObj string] stringByAppendingString:@"abc"] また [[myObj string] appendString:@"abc"] 文字列オブジェクトの可変/不変の性質に依存します。

結論として:1つの投稿ですべてを説明するのは非常に大きなトピックです。 Appleドキュメントを読んで、Objective-Cに関する本を購入することをお勧めします。 Aaron Hillegassは1つを書きました - Objective -CおよびMac OS Xの初心者にとっては良いスタートです。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top