iPhone开发 - IBAction为和@property

问题描述:

在此代码:iPhone开发 - IBAction为和@property

#import <UIKit/UIKit.h> 

@interface ViewController : UIViewController 
{ 
    UILabel *labelsText; 
} 

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

-(IBAction) clicked: (id) sender; 

@end 

1. 与@property线.. 正如我理解它是@property(布拉布拉)数据类型变量 但码具有3东东? IBoutlet,UIlabel和* labelsText

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

当定义一个属性..你并不需要将其声明为一个成员变量..

所以

UILabel *labelsText; 

不需要......

IBAction酷似void除了它是特殊的方式来与您沟通,该功能是附加到xib文件中的组件

编辑: //更新/..correction ..thanks到BJ荷马

财产是为您的变量和对象setter和getter方法简单的方法.. 所以不是也许10行代码.. 你也可以在它只有4行...

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

我不确定你最后一次编辑的意思,用self.propertyname。这些是自动完成的吗? – user1021085 2012-03-04 14:08:49

+0

我的最后一次编辑是针对非ARC代码的......无论如何..它会给你想法当你创建一个正确的时候会发生什么。 – Shubhank 2012-03-04 14:10:58

+0

你的@property示例是不正确的。编译器不会生成'-set:'方法;它会生成一个'-setPropertyName:'方法。你不应该在属性访问器的返回值上调用'release';它可能已经返回了底层ivar的副本,例如,在这种情况下,您会释放错误的对象。在dealloc中,你只是想直接访问伊娃。 – 2012-03-04 14:34:20

IBOutlet中,IBAction为你意味着什么,而事实上它们是由预编译器(他们分别#define的如无物和无效的)剥离。

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

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

+0

在教程中:http://www.youtube.com/watch?v=CZrMt0qVf58&feature=relmfu评论说:“在最后一个例子,你为什么不添加一个按钮插座呢? imho,outlet是代码 - >对象,动作是对象 - >代码(字段)。“ 他是什么意思? – user1021085 2012-03-04 20:27:54