【问题标题】:Iphone dev - IBAction and @propertyIphone dev - IBAction 和@property
【发布时间】:2012-03-04 13:58:55
【问题描述】:

在这段代码中:

#import <UIKit/UIKit.h>

@interface ViewController : UIViewController
{
  UILabel *labelsText;
}

@property(strong, nonatomic) IBOutlet UILabel *labelsText;

-(IBAction) clicked: (id) sender;

@end

1。 带有@property 的行.. 据我了解,这是@property(blabla) 数据类型变量 但是代码有3个东西? IBoutlet、UIlabel 和 *labelsText

2。 单击的功能将根据按下的按钮更改标签内容,因为两个按钮都连接到该功能。 但它返回一个 IBAction?更改标签文本的代码在函数中,它从不返回任何内容?它可以很容易地被 -(void) 代替吗?

【问题讨论】:

    标签: iphone automatic-ref-counting


    【解决方案1】:

    IBOutlet 和 IBAction 都是我们因历史原因而坚持使用的丑陋的 hack。传统上,它们是这样定义的:

    #define IBOutlet
    #define IBAction void
    

    所以 IBOutlet 完全从编译后的代码中消失了,而 IBAction 与 void 完全相同。它们的存在是因为由于 GPL 许可限制,Apple 无法将 GCC 直接嵌入到 Interface Builder 中。但是 IB 需要能够解析头文件,以便了解任何给定类上可用的出口和操作。他们没有为 IB 实现一个完整的 Obj-C(++) 解析器,而是引入了 IB 可以在原始标头中查找的这些关键字,然后只解析一个声明。

    随着 LLVM 编译器的出现,情况发生了变化。现在 IB 可以使用完整的解析器,IBOutletIBAction 的定义如下:

    #define IBOutlet __attribute__((iboutlet))
    #define IBAction void)__attribute__((ibaction)
    

    所以它们在编译时仍然“无关紧要”,但现在它们是通过__attribute__(()) 语法捕获的,这是一种记录有关声明的元数据的机制。 IB 可以找到它们并提供完整的编译器支持,每个人都很高兴。

    【讨论】:

    • 教程中:youtube.com/watch?v=CZrMt0qVf58&feature=relmfu 有评论说:“在最后一个例子中,为什么不为按钮添加一个出口?恕我直言,出口是代码->对象,动作是对象-> 代码(字段)。”他这是什么意思?
    【解决方案2】:

    IBOutlet 和 IBAction 没有任何意义,实际上它们已被预编译器剥离(它们分别被 #defined 为空和 void)。

    IBOutlet 是 Xcode 的一个特殊指令,您打算将该属性用作 Interface Builder 中的插座。 IBAction 与操作目标(按钮触摸等)相同。

    【讨论】:

      【解决方案3】:

      定义属性时..不需要将其声明为成员变量..

      所以

        UILabel *labelsText;
      

      不需要...

      IBActionvoid 完全一样,只是它是一种特殊的方式来与您交流该函数附加到 xib 文件中的组件

      edit : // 更新/..更正 ..感谢 BJ Homer

      property 是为变量和对象生成 setter 和 getter 方法的简单方法。 所以而不是10行代码.. 你也可以只用 4 行...

      @property peopertyname
      @synthesize peopertyname
      [self setpropertyname:nil]; // in viewdidUnload
      [propertyname release]; // dealloc
      

      【讨论】:

      • 我不确定您上次使用 self.propertyname 进行的编辑是什么意思。这些是自动完成的吗?
      • 我的最后一次编辑是针对非 ARC 代码......无论如何......它会让你知道当你正确创建一个代码时究竟会发生什么......
      • 您的@property 示例不正确。编译器不会生成-set: 方法;它将生成一个-setPropertyName: 方法。你永远不应该在属性访问器的返回值上调用release;例如,它可能返回了底层 ivar 的副本,在这种情况下,您将释放错误的对象。在 dealloc 中,你只想直接访问 ivar。
      猜你喜欢
      • 1970-01-01
      • 2011-06-09
      • 2019-07-24
      • 1970-01-01
      • 2010-11-28
      • 2010-12-11
      • 1970-01-01
      • 1970-01-01
      • 2016-03-17
      相关资源
      最近更新 更多