@dynamic対@synthesize、違いは何ですか?
-
18-09-2019 - |
質問
@property
または@dynamic
と@synthesize
を実装の違いは何ですか?
解決
@synthesizeは、あなたのプロパティのgetterメソッドとsetterメソッドを生成します。 @dynamicだけgetterメソッドとsetterメソッドは、クラス自体ではない実装されていますが、どこか別の場所(スーパークラスのようなまたは実行時に提供されます)コンパイラに指示します。
@dynamicの用途は、例えばありますNSManagedObject
のサブクラス(CoreData)またはあなたが出口として定義されていなかった、スーパークラスで定義されたプロパティのための出口を作成したいときます。
@dynamicもアクセサを実装するための責任を委譲するために使用することができます。あなたはクラス内でアクセサを自分で実装するなら、あなたは通常@dynamicを使用しないでください。
スーパークラスます:
@property (nonatomic, retain) NSButton *someButton;
...
@synthesize someButton;
サブクラス:
@property (nonatomic, retain) IBOutlet NSButton *someButton;
...
@dynamic someButton;
他のヒント
この記事のを見てみましょう。見出しの下に「メソッドが実行時に提供された」ます:
(それは柔軟であり、どちらかが実装されている場合のためのメソッドを生成しない「合成混合およびカスタムアクセッサ」セクションで述べたようにある)いくつかのアクセサは、CoreDataのNSManagedObjectクラスで使用される特定のものとして、実行時に動的に作成されます。あなたはこれらのケースのプロパティを宣言して使用したいのですが、コンパイル時に欠落している方法についての警告を避けたい場合は、代わりに@synthesizeの@dynamicディレクティブを使用することができます。
...
「メソッドが道を進んでいる、それについて心配しないでください。」
@dynamicディレクティブは、本質的にコンパイラに指示します使い方
@synthesize
ディレクティブは、一方で、コンパイル時にあなたのためのアクセサメソッドを生成しますます。
、一般的に、あなたは、コンパイラはあなたのためのゲッターおよび/または設定を生成させる@synthesizeを使用し、@dynamicます。
別の繊細まだ言及していないがあります。@synthesize ははゲッターやセッターのいずれかの実装に自分自身を、提供できるようになります。あなたが唯一のいくつかの余分なロジックのgetterを実装しますが、コンパイラは(オブジェクトのために、自分自身を書くために、通常は少し複雑である、)セッターを生成するようにしたい場合に便利です。
ただし、それはまだ本当の分野(例えば、あなたが-(int) getFoo();
を書く場合は、int foo;
フィールドを持っている必要があります)に裏付けされなければならない@ synthesize'dアクセサの実装を記述しない場合。値が(例えば、他のフィールドから計算)何か他のものによって生産されている場合、あなたは@dynamic使用する必要があります。
@dynamicは、典型的に使用されます。 NSManagedObjectは(すべてのプロパティが動的である理由)これを行います - 。いくつかのコンパイラの警告を抑制している。
を参照:, NSManagedObjectとCoreDataなし(プロパティを動的に作成する方法の良い概要について:<のhref = "http://developer.apple.com/library/ios/#documentation/Cocoa/Conceptual/ObjCRuntimeGuide/記事/ ocrtDynamicResolution.html#// apple_ref / DOC / UID / TP40008048-CH102-SW1" > http://developer.apple.com/library/ios/#documentation/Cocoa/Conceptual/ObjCRuntimeGuide/Articles/ocrtDynamicResolution.html# // apple_ref / DOC / UID / TP40008048-CH102-SW1する
ここでは@dynamicのの一例です。
#import <Foundation/Foundation.h>
@interface Book : NSObject
{
NSMutableDictionary *data;
}
@property (retain) NSString *title;
@property (retain) NSString *author;
@end
@implementation Book
@dynamic title, author;
- (id)init
{
if ((self = [super init])) {
data = [[NSMutableDictionary alloc] init];
[data setObject:@"Tom Sawyer" forKey:@"title"];
[data setObject:@"Mark Twain" forKey:@"author"];
}
return self;
}
- (void)dealloc
{
[data release];
[super dealloc];
}
- (NSMethodSignature *)methodSignatureForSelector:(SEL)selector
{
NSString *sel = NSStringFromSelector(selector);
if ([sel rangeOfString:@"set"].location == 0) {
return [NSMethodSignature signatureWithObjCTypes:"v@:@"];
} else {
return [NSMethodSignature signatureWithObjCTypes:"@@:"];
}
}
- (void)forwardInvocation:(NSInvocation *)invocation
{
NSString *key = NSStringFromSelector([invocation selector]);
if ([key rangeOfString:@"set"].location == 0) {
key = [[key substringWithRange:NSMakeRange(3, [key length]-4)] lowercaseString];
NSString *obj;
[invocation getArgument:&obj atIndex:2];
[data setObject:obj forKey:key];
} else {
NSString *obj = [data objectForKey:key];
[invocation setReturnValue:&obj];
}
}
@end
int main(int argc, char **argv)
{
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
Book *book = [[Book alloc] init];
printf("%s is written by %s\n", [book.title UTF8String], [book.author UTF8String]);
book.title = @"1984";
book.author = @"George Orwell";
printf("%s is written by %s\n", [book.title UTF8String], [book.author UTF8String]);
[book release];
[pool release];
return 0;
}
のドキュメントを1として:
@dynamicは、アクセサメソッドが実行時に提供されているようコンパイラーに指示します。
調査の少しで、私はアクセサメソッドを提供することが@dynamicディレクティブを上書きすることが分かっています。
@synthesizeはあなたのために、これらのアクセサを作成するためのコンパイラ(ゲッターとセッター)に指示します。
@propertyはアクセサを作成するコンパイラに伝え、それはドット表記または[オブジェクトのメッセージ
でアクセスすることができますを追加したいことの一つは、プロパティは、それがメモリを占有しません@dynamicとして宣言されている場合(Iが割り当て計器で確認)ということです。その結果は、クラスのカテゴリでプロパティを宣言することができるということです。
の のアップルのドキュメントを1として。のの
あなたは@synthesize
宣言で与えた仕様に一致する実装を作成するようにコンパイラに伝えるために、クラスの実装ブロックに@property
ステートメントを使用します。
あなたはそれが@dynamic
宣言で指定されたアクセサメソッドの実装を見つけることができない場合に警告を抑制するために、コンパイラに指示する@property
ステートメントを使用します。
の の詳細情報: - のの
https://developer.apple。 COM /ライブラリ/ IOS /ドキュメント/一般/概念/ DevPedia-CocoaCore / DeclaredProperty.htmlする