28

私はiOS5の本を使ってiOSプログラミングを学んでいます。

@synthesize coolWord;

^ synthesizeは、.mファイルのすべてのプロパティに使用されます

iOS6では、自動的に合成されるため、合成の必要はないと聞きました。これは本当ですか?

合成はiOS6で何らかの役割を果たしますか?

説明してくれてありがとう。:)

4

6 に答える 6

35

@synthesize in Objective-cは、プロパティセッターとゲッターを実装するだけです。

- (void)setCoolWord:(NSString *)coolWord {
     _coolWord = coolWord;
}

- (NSString *)coolWord {
    return _coolWord;
}

これが実装されているのはXcode4の場合です(iOS6にはXcode 4が必要です)。技術的には実装します@synthesize coolWord = _coolWord_coolWordはインスタンス変数でcoolWordあり、はプロパティです)。

これらのプロパティにアクセスするself.coolWordには、設定self.coolWord = @"YEAH!";と取得の両方に使用しますNSLog(@"%@", self.coolWord);

また、セッターとゲッターの両方を手動で実装できることにも注意してください。セッターとゲッターの両方を実装する場合は、手動で含める必要があります@synthesize coolWord = _coolWord;(これがなぜであるかはわかりません)。

于 2013-02-02T03:07:29.093 に答える
9

iOS6での自動合成にはまだ必要です@synthesize

  • で定義されたプロパティのアクセサメソッドを生成します@protocol
  • 独自のアクセサーを含めたときにバッキング変数を生成します。

2番目のケースは、次のように確認できます。

#import <Foundation/Foundation.h>
@interface User : NSObject
@property (nonatomic, assign) NSInteger edad;
@end
@implementation User
@end

次のように入力clang -rewrite-objc main.mし、変数が生成されることを確認します。次に、アクセサを追加します。

@implementation User
-(void)setEdad:(NSInteger)nuevaEdad {}
-(NSInteger)edad { return 0;}
@end

次のように入力clang -rewrite-objc main.mし、変数が生成されていないことを確認します。したがって、アクセサからのバッキング変数を使用するには、を含める必要があります@synthesize

これに関連している可能性があります:

Clangは、宣言されたプロパティの自動合成をサポートします。この機能を使用して、clangは、@ dynamicで宣言されておらず、ユーザーが提供するバッキングgetterメソッドとsetterメソッドを持たないプロパティのデフォルトの合成を提供します。

于 2013-02-02T03:39:57.900 に答える
4

iOS6との関係はわかりません@synthesizeが、Xcode 4.0以降、基本的に非推奨になっています。基本的に、あなたはそれを必要としません!宣言を使用するだけ@propertyで、舞台裏でコンパイラが宣言を生成します。

次に例を示します。

@property (strong, nonatomic) NSString *name;

/*Code generated in background, doesn't actually appear in your application*/
@synthesize name = _name;

- (NSString*)name
{
    return _name;
}

- (void) setName:(NSString*)name
{
    _name = name;
}

そのコードはすべて、コンパイラーの面倒を見てくれます。したがって、を持っているアプリケーションがある場合は、@synthesizeクリーンアップを行うときが来ました。

明確にするのに役立つかもしれない私の同様の質問をここで見ることができます。

于 2013-02-02T05:28:03.623 に答える
2

@synthesizeディレクティブは最新のObj-Cコンパイラ(iOS 6に付属しているコンパイラ)に自動的に挿入される と思います。

@synthesize pre-iOS 6のポイントは、インスタンス変数のゲッターとセッターを自動的に作成して、[classInstance getCoolWord][classInstance setCoolWord:(NSString *)aCoolWord]が生成されるようにすることです。それらはで宣言されている@propertyため、getterとsetterのドット構文も便利です。

于 2013-02-02T03:08:20.440 に答える
1
hope this will help little more

yes previously we have to synthesis the property by using @synthesis now it done by IDE itself.

しかし、私たちはそれを次のように使うことができます

//IDEが内部で行うこと

@synthesis name=_name;

_nameを使用して特定のプロパティにアクセスしますが、firstnameのような他の方法で合成したい場合は、次のように実行できます。

@synthesis name= firstname

または名前だけで

@synthesis name=name
于 2014-07-02T10:58:08.253 に答える
0

iOS6の自動合成では、バッキングivarを具体的に宣言したり、@synthesizeステートメントを記述したりする必要がなくなりました。コンパイラが@propertyステートメントを見つけると、今レビューしたガイドラインを使用して、コンパイラが私たちに代わって両方を実行します。したがって、私たちがする必要があるのは、次のようなプロパティを宣言することだけです。

@property (nonatomic, strong) NSString *abc;  

iOS 6では、@ synthesize abc=_abcがコンパイル時に自動的に追加されます。

于 2013-02-02T03:07:08.267 に答える