1

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

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

4

2 に答える 2

2

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 は、インターフェース内の両方の宣言を置き換えるだけでなく、getter と setter のセマンティクスに関するより良いヒントを呼び出し元に提供します。また、アクセサーを @synthesize して、コンパイラーがそれらのコードを自動的に生成できるようにすることもできます (@synthesize する必要はありません。必要に応じて独自の実装を提供できます)。上記のすべてを置き換えることができます

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

@implementation Foo

// need dealloc to release foo too.

@synthesize foo; 
@end

これにより入力の手間が大幅に省けますが、インタフェースから setFoo: が新しい値を保持し、マルチスレッド環境で (他のロック メカニズムなしで)プロパティを使用 (設定または取得) するのは安全ではないこともわかります。

于 2010-09-28T10:02:50.593 に答える
1

@property-アクセス修飾子とメモリ修飾子を使用してプロパティを宣言します。プロパティは、読み取り専用または読み取り/書き込み、非アトミックまたはアトミック(スレッドセーフ)、割り当て/保持/コピー管理が可能です。実際には、Tiger時代のように単純なgetterメソッドとsetterメソッドを宣言できますが、aを宣言する@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は、Objective-CおよびMacOSXの初心者にとって良いスタートとなるものを書きました。

于 2010-09-28T08:04:15.013 に答える