私はiOS5の本を使ってiOSプログラミングを学んでいます。
@synthesize coolWord;
^ synthesizeは、.mファイルのすべてのプロパティに使用されます
iOS6では、自動的に合成されるため、合成の必要はないと聞きました。これは本当ですか?
合成はiOS6で何らかの役割を果たしますか?
説明してくれてありがとう。:)
私はiOS5の本を使ってiOSプログラミングを学んでいます。
@synthesize coolWord;
^ synthesizeは、.mファイルのすべてのプロパティに使用されます
iOS6では、自動的に合成されるため、合成の必要はないと聞きました。これは本当ですか?
合成はiOS6で何らかの役割を果たしますか?
説明してくれてありがとう。:)
@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;
(これがなぜであるかはわかりません)。
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メソッドを持たないプロパティのデフォルトの合成を提供します。
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
クリーンアップを行うときが来ました。
明確にするのに役立つかもしれない私の同様の質問をここで見ることができます。
@synthesize
ディレクティブは最新のObj-Cコンパイラ(iOS 6に付属しているコンパイラ)に自動的に挿入される と思います。
@synthesize pre-iOS 6のポイントは、インスタンス変数のゲッターとセッターを自動的に作成して、[classInstance getCoolWord]
と[classInstance setCoolWord:(NSString *)aCoolWord]
が生成されるようにすることです。それらはで宣言されている@property
ため、getterとsetterのドット構文も便利です。
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
iOS6の自動合成では、バッキングivarを具体的に宣言したり、@synthesizeステートメントを記述したりする必要がなくなりました。コンパイラが@propertyステートメントを見つけると、今レビューしたガイドラインを使用して、コンパイラが私たちに代わって両方を実行します。したがって、私たちがする必要があるのは、次のようなプロパティを宣言することだけです。
@property (nonatomic, strong) NSString *abc;
iOS 6では、@ synthesize abc=_abcがコンパイル時に自動的に追加されます。