문제

구현의 차이점은 무엇입니까? @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를 사용하여 컴파일러가 자신을 위해 getters 및/ 또는 설정을 생성하고 직접 작성하려면 @dynamic을 생성하도록합니다.

아직 언급되지 않은 또 다른 미묘함이 있습니다 : @synthesize ~ 할 것이다 getter 또는 setter의 구현을 직접 제공하겠습니다. 이것은 여분의 논리를 위해 getter를 구현하려는 경우에만 유용하지만 컴파일러가 세터를 생성하도록하십시오 (객체의 경우 일반적으로 자신을 쓰기가 조금 더 복잡합니다).

그러나 @ynthesize'd Accessor에 대한 구현을 작성하는 경우 여전히 실제 필드에 의해 뒷받침되어야합니다 (예 : 글을 쓰는 경우 -(int) getFoo(); 당신은 있어야합니다 int foo; 필드). 값이 다른 무언가에 의해 생산되는 경우 (예 : 다른 필드에서 계산 된) @dynamic을 사용해야합니다.

@dynamic은 일반적으로 런타임에 속성이 동적으로 생성 될 때 (위에서 언급 한 바와 같이) 사용됩니다. nsmanagedObject는이 작업을 수행합니다 (모든 속성이 동적 인 이유). 일부 컴파일러 경고를 억제합니다.

속성을 동적으로 만드는 방법에 대한 좋은 개요는 (nsmanagedObject 및 coredata없이 :, 참조 : 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;
}

문서에 따라 :

https://developer.apple.com/library/mac/documentation/cocoa/conceptual/objcruntimeguide/articles/ocrtdynamicresolution.html

@dynamic은 컴파일러에게 액세서 메소드가 런타임에 제공된다고 알려줍니다.

약간의 조사를 통해 액세서 방법을 제공하는 것이 @dynamic 지시문을 무시한다는 것을 알았습니다.

@synthesize는 컴파일러에게 해당 액세서를 만들도록 지시합니다 (Getter and Setter)

@Property는 컴파일러에게 액세서가 생성 될 것이며 DOT 표기법 또는 [객체 메시지]로 액세스 할 수 있다고 말합니다.

추가하고 싶은 것은 속성이 @dynamic으로 선언되면 메모리를 점유하지 않는다는 것입니다 (할당 기기로 확인 됨). 결과적으로 클래스 카테고리에서 속성을 선언 할 수 있습니다.

Apple 문서에 따라.

당신은 사용합니다 @synthesize 클래스의 구현 블록의 명령문은 컴파일러에게 귀하가 제공 한 사양과 일치하는 구현을 작성하도록 지시합니다. @property 선언.

당신은 사용합니다 @dynamic 컴파일러에게 경고를 억제하도록 지시하는 진술은 @property 선언.

더 많은 정보:-

https://developer.apple.com/library/ios/documentation/general/conceptual/devpedia-cocoacore/declaredproperty.html

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top