Iphone dev - IBAction和@property

时间:2012-03-04 13:58:55

标签: iphone automatic-ref-counting

在此代码中:

#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吗?更改标签文本的代码在函数中,它永远不会返回任何内容?它可以很容易 - (无效)吗?

3 个答案:

答案 0 :(得分:6)

IBOutlet和IBAction都是丑陋的黑客,我们因历史原因而坚持不懈。传统上,它们的定义如下:

#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可以通过完整的编译器支持找到它们,每个人都很高兴。

答案 1 :(得分:1)

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

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

答案 2 :(得分:0)

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

所以

  UILabel *labelsText;

不是必需的......

IBActionvoid完全相同,只是它是一种与您沟通的特殊方式,即此函数附加到xib文件中的组件

编辑: // update /..correction ..感谢BJ Homer

属性是为变量和对象生成setter和getter方法的简便方法。 所以代替10行代码.. 你也可以只用4行...

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