在此代码中:
#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吗?更改标签文本的代码在函数中,它永远不会返回任何内容?它可以很容易 - (无效)吗?
答案 0 :(得分:6)
IBOutlet和IBAction都是丑陋的黑客,我们因历史原因而坚持不懈。传统上,它们的定义如下:
#define IBOutlet
#define IBAction void
所以IBOutlet完全从编译的代码中消失了,IBAction与void
完全相同。它们的存在是由于GPL许可限制导致Apple无法将GCC直接嵌入Interface Builder。但IB需要能够解析头文件,以便知道任何给定类可用的出口和操作。他们没有为IB实现一个完整的Obj-C(++)解析器,而是引入了IB可以在原始头中查找的关键字,然后只解析那个声明。
随着LLVM编译器的出现,情况发生了变化。现在IB可以使用完整的解析器,IBOutlet
和IBAction
的定义如下:
#define IBOutlet __attribute__((iboutlet))
#define IBAction void)__attribute__((ibaction)
所以它们在编译时仍然“无关紧要”,但现在它们是通过__attribute__(())
语法捕获的,这是一种记录元数据声明的机制。 IB可以通过完整的编译器支持找到它们,每个人都很高兴。
答案 1 :(得分:1)
IBOutlet是Xcode的一个特殊指令,您打算将该属性用作Interface Builder中的插座。 IBAction对于动作目标(按钮触摸等)是相同的。
答案 2 :(得分:0)
定义属性时......您不需要将其声明为成员变量..
所以
UILabel *labelsText;
不是必需的......
IBAction
与void
完全相同,只是它是一种与您沟通的特殊方式,即此函数附加到xib文件中的组件
编辑: // update /..correction ..感谢BJ Homer
属性是为变量和对象生成setter和getter方法的简便方法。 所以代替10行代码.. 你也可以只用4行...
@property peopertyname
@synthesize peopertyname
[self setpropertyname:nil]; // in viewdidUnload
[propertyname release]; // dealloc