• @dynamic关键字


    @dynamic

      You use the@dynamic keyword to tell the compiler that you will fulfill the API contract implied by a property either by providing method implementations directly or at runtime using other mechanisms such as dynamic loading of code or dynamic method resolution. It suppresses the warnings that the compiler would otherwise generate if it can"t find suitable implementations. You should only use it if you know that the methods will be available at runtime.

      The example shown in Listing 5-3 illustrates using @dynamic with a subclass of NSManagedObject.

      Listing 5-3 Using @dynamic with NSManagedObject

      @interface MyClass : NSManagedObject

      {

      }

      @property(nonatomic, retain) NSString *value;

      @end

      @implementation MyClass

      @dynamic value;

      @end

      NSManagedObject is provided by the Core Data framework. A managed object class has a corresponding schema that defines attributes and relationships for the class; at runtime, the Core Data framework generates accessor methods for these as necessary. You therefore typically declare properties for the attributes and relationships, but you don"t have to implement the accessor methods yourself, and shouldn"t ask the compiler to do so. If you just declared the property without providing any implementation, however, the compiler would generate a warning. Using @dynamic suppresses the warning.

      大概的翻译一下:

      @dynamic 就是要来告诉编译器,代码中用@dynamic修饰的属性,其getter和setter方法会在程序运行的时候或者用其他方式动态绑定,以便让编译器通过编译。其主要的作用就是用在NSManageObject对象的属性声明上,由于此类对象的属性一般是从Core Data的属性中生成的,Core Data框架会在程序运行的时候为此类属性生成getter和Setter方法。

    @dynamic与@synthesize的区别在于:

      使用@synthesize,编译器会确实的产生getter和setter方法,而@dynamic仅仅是告诉编译器这两个方法在运行期会有的,无需产生警告。

      假设有这么个场景,a1类,a2类分别继承A类,A类实现某个协议(@protocol),协议中某个属性( somePropety )不想在A中实现,而在a1类,a2类中分别实现。如果A中不写任何代码,编译器就会给出警告:

    “use @synthesize, @dynamic or provide a method implementation"

      这时只要用@dynamic somePropety;

      编译器就不会警告,同时也不会产生任何默认代码。

  • 相关阅读:
    记录下平台多种语言加密算法实施的历程
    Php AES加密、解密与Java互操作的问题
    Tomcat服务器常用配置和HTTP简介
    淘宝IP地址查询
    linux下hexdump和od命令:显示文件十六进制格式
    技术讨论 | 简谈渗透测试各阶段我常用的那些“神器”
    串口发送数据速度
    在Qt示例项目的C ++ / QML源中的//! [0]的含义是什么?
    C++ 函数参数中“ *&代表什么? ”
    c++中三种参数引用方式
  • 原文地址:https://www.cnblogs.com/HMJ-29/p/5996852.html
Copyright © 2020-2023  润新知