zoukankan      html  css  js  c++  java
  • 转:ObjectiveC使用@dynamic和@synthesize

    @dynamic 意思是由开发人员提供相应的代码:对于只读属性需要提供 setter,对于读写属性需要提供 setter 和 getter。
    @synthesize 意思是,除非开发人员已经做了,否则由编译器生成相应的代码,以满足属性声明。

     查阅了一些资料确定@dynamic的意思是告诉编译器,属性的获取与赋值方法由用户自己实现, 不自动生成。
    @dynamic just tells the compiler that the getter and setter methods are implemented not by the class itself but somewhere else (like the superclass)

    再看苹果官方文档说明似乎更有意思 :

    动态方法解析

     
    有时候,您需要动态地提供一个方法的实现。例如,Objective-C中属性(Property)(参考Objective-C 2.0 程序设计语言中属性小节)前的修饰符@dynamic
     
    @dynamic propertyName;
    表示编译器须动态地生成该属性对应地方法
     
    您可以通过实现resolveInstanceMethod:resolveClassMethod:动态地实现给定选标的对象方法或者类方法
     
    Objective-C方法可以认为是至少有两个参数——self和_cmd—— 的C函数。您可以通过class_addMethod方法将一个函数加入到类的方法中。例如,有如下的函数:
     
    void dynamicMethodIMP(id self, SEL _cmd) {
      // implementation ….
    }
    您可以通过resolveInstanceMethod:将它作为类方法resolveThisMethodDynamically的实现
     
    @implementation MyClass
    + (BOOL)resolveInstanceMethod:(SEL)aSEL
    {
      if (aSEL == @selector(resolveThisMethodDynamically)) { 
         class_addMethod([self class], aSEL, (IMP) dynamicMethodIMP, "v@:");
         return YES;
      }
      return [super resolveInstanceMethod:aSEL];
    }
    @end
    通常消息转发(见 “消息转发”)和动态方法解析是互不相干的。在进入消息转发机制之前,respondsToSelector:和instancesRespondToSelector: 会被首先调用。您可以在这两个方法中为传进来的选标提供一个IMP。如果您实现了resolveInstanceMethod:方法但是仍然希望正常的消息转发机制进行,您只需要返回NO就可以了。
     
    在Aaron Hillegass写的Cocoa programming for Mac OS X中30章的Department.m中也运用了Dynamic方法,即Key-Value Coding方法实现的。
     
    来源:http://blog.sina.com.cn/s/blog_6f92e3580100zx5s.html
  • 相关阅读:
    31天重构学习笔记28. 为布尔方法命名
    .NET 技术社区之我见(中文篇)
    31天重构学习笔记26. 避免双重否定
    31天重构学习笔记25. 引入契约式设计
    31天重构学习笔记20. 提取子类
    31天重构学习笔记18. 使用条件判断代替异常
    31天重构学习笔记19. 提取工厂类
    31天重构学习笔记24. 分解复杂判断
    31天重构学习笔记23. 引入参数对象
    31天重构学习笔记17. 提取父类
  • 原文地址:https://www.cnblogs.com/hubj/p/2331217.html
Copyright © 2011-2022 走看看