2012-03-04 44 views
1

在此代碼: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)而不是?

回答

0

當定義一個屬性..你並不需要將其聲明爲一個成員變量..

所以

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

2

IBOutlet中,IBAction爲你意味着什麼,而事實上它們是由預編譯器(他們分別#define的如無物和無效的)剝離。

IBOutlet是Xcode的特殊指令,您打算將該屬性用作Interface Builder中的插座。 IBAction對於動作目標(按鈕觸摸等)是一樣的。

5

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