2012-12-05 24 views
3

我是Objective-C的新手,並試圖通過一本書讓自己的方式。當我遇到錯誤時,我正沿着一個非常基本的教程。代碼與書中的代碼相同。IBOutlet類型編號

我有一個類MyController.hMyController.m。錯誤發生在聲明中。

MyController.h

#import <Foundation/Foundation.h> 
@interface MyController : NSObject 
@property (assign) IBOutlet id *textLabel; 

- (IBAction)clickMeButtonClicked:(id)sender; 
- (IBAction)deleteMeButtonClicked:(id)sender; 

@end  

第三行給了我一個警告和一個錯誤:

錯誤:

Pointer to non-const type 'id' with no explicit ownership 

警告:

Property with 'iboutlet' attribute must be an object type (invalid '__strong id *') 

正如我說我是j最開始學習,我肯定錯過了一些非常明顯的東西。這似乎與'id'類型有關,但根據這本書,沒有任何錯誤。

謝謝你的幫助!

+0

冗餘*實際上是問題所在。顯然,作者錯過了這個錯誤。感謝大家指出了這一點。 – max

+0

我剛剛做了一些額外的研究,並允許您繼續在教程中的解決方案是'@property(assign)IBOutlet NSTextField * textLabel;' – max

回答

0

id不需要聲明爲指針。正確的方法來聲明這將是如下:

@property (assign) IBOutlet id textLabel;//Don't need the * 

您可以找到id類型的更全面的解釋在this question

+0

您能更具體一點嗎?什麼是正確的方法來做到這一點? – max

+0

@max我編輯了一個更多的信息我的答案 –

+0

謝謝你! – max

0

分配也許應該改到強,爲textLabel之前刪除*。

3

id已經是一個指針:

typedef struct objc_object { 
    Class isa; 
} *id; 

因此你不需要*在聲明。嘗試:

@property (assign) IBOutlet id textLabel; 
+0

只是好奇,你在哪裏找到'id'類型的定義?我嘗試使用Xcode的定義,但它不想做任何事情 –

+0

我不在我的Mac,所以我用谷歌;-)這可能有所幫助:http://stackoverflow.com/questions/1990695/in-cocoa - 如何-是-定義-ID型 – trojanfoe

0

嘗試改變(assign)到(nonatomic, retain),因爲這是一個IBOutlet,而不是一個原始的,你要保留和釋放。把非原子放在那裏也是一個很好的做法,它與線程有關,但我不能給你關於這個的確切信息。另外,不要忘記將[textLabel 發佈]放入dealloc方法中,因爲您需要釋放您保留,創建或複製的每個對象。