programing

@size와 @dynamic의 차이점은 무엇입니까?

elseif 2023. 4. 14. 21:17

@size와 @dynamic의 차이점은 무엇입니까?

「 」를 는 것과 입니까?@property@dynamic ★★★★★★★★★★★★★★★★★」@synthesize

@size는 속성의 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을 사용합니다.

아직 언급되지 않은 또 다른 미묘한 점이 있습니다.@synthe size를 사용하면 getter 또는 setter 중 하나를 직접 구현할 수 있습니다.이것은 getter를 몇 가지 추가 로직만을 위해 구현하고 싶은 경우에 편리합니다만, 컴파일러가 setter를 생성하도록 합니다(오브젝트의 경우, 일반적으로는 스스로 쓰는 것이 조금 더 복잡합니다).

에 대한 @synthesize'd로 @synthesize'd는 @synthesize'd로 .-(int) getFoo();꼭 있어야 합니다.int foo;필드)를 참조해 주세요.값이 다른 것(예를 들어 다른 필드에서 계산됨)에 의해 생성되는 경우 @dynamic을 사용해야 합니다.

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

NSManaged Object 및 CoreData: 를 사용하지 않고 동적으로 속성을 작성하는 방법에 대한 자세한 내용은 http://developer.apple.com/library/ios/ #documentation/Cocoa/Conceptual/ObjCRuntimeGuide/Articles/ocrtDynamicResolution.ht#/apple_ref/d/docuid/TP40008048-SW102SW를 참조하십시오.

@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 명령보다 우선한다는 것을 알게 되었습니다.

@compiler size는 컴파일러에 이러한 접근기(getter 및 setter)를 작성하도록 지시합니다.

@compiler에게 액세스포인트가 작성되고 닷 표기 또는 [객체 메시지]를 사용하여 액세스 할 수 있음을 알립니다.

덧붙이고 싶은 것은 속성이 @dynamic으로 선언되어도 메모리를 차지하지 않는다는 것입니다(할당 수단으로 확인했습니다).그 결과 클래스 카테고리의 속성을 신고할 수 있습니다.

Apple의 설명서에 따릅니다.

를 사용합니다.@synthesize클래스 구현 블록에 있는 스테이트먼트를 사용하여 컴파일러에 사용자가 지정한 사양과 일치하는 구현을 작성하도록 지시합니다.@property선언.

를 사용합니다.@dynamic컴파일러가 지정한 액세스 메서드의 구현을 찾을 수 없는 경우 경고를 억제하도록 명령하는 스테이트먼트@property선언.

상세정보:-

https://developer.apple.com/library/ios/documentation/General/Conceptual/DevPedia-CocoaCore/DeclaredProperty.html

언급URL : https://stackoverflow.com/questions/1160498/synthesize-vs-dynamic-what-are-the-differences