2012-07-31 84 views
1

我是新來的objective-c和幾乎與委託使用的方式混淆。我遇到了這個代碼,我想用它來澄清一些疑惑。目標-c委託語法查詢

#import <Foundation/Foundation.h> 

@protocol ProcessDataDelegate <NSObject> 

@required 
- (void) processSuccessful: (BOOL)success; 

@end 

@interface ClassWithProtocol : NSObject 
{ 
    id <ProcessDataDelegate> delegate; 
} 

@property (retain) id delegate; 

-(void)startSomeProcess; 

@end 

在這裏,有2個引用單詞「委託」誰能解釋一下在「ID尖括號代表角度支架封閉」環境中使用時,它的意思?

再次,有一個名爲委託的屬性。它應該不會導致任何形式的衝突嗎?

由於提前,

+2

恕我直言,應該有一個協議要求屬性以及。代碼將按原樣工作,但我發現編寫@property(retain)id 委託更清晰 – 2012-07-31 23:29:54

回答

2

不,只有一個特性,通過@property (retain) id delegate定義的;另一個是(有點)私有變量的NSObject它不是一個在objective-c意義上的屬性...然後,您的.m文件中有關鍵字@synthetize,這擴展了屬性。

另一個符號id<protocol>告訴我們,代表有望符合某個協議。

您可以從課程中訪問兩者,但只能從外部訪問屬性。此外,對於屬性,還會生成其他一些內容 - 如果保留(不使用ARC時),則爲內存管理例程。

要完成(?混亂)講座,還有就是要有一流的私人性質的好辦法,當你在.m文件,而不是.H在匿名類就像定義它們:

@interface MyClass() 

@property (nonatomic, retain) NSString privateString; 

@end 

@implementation 
@synthetize privateString; 

// ... 

@end 
2

這條線:

id <ProcessDataDelegate> delegate; 

說,有一個叫delegate一個實例變量,它可以是你喜歡的任何類型的對象,只要該對象採用ProcessDataDelegate協議。

稍後以@property開頭的行只是聲明該類的Objective-C 2.0屬性,該屬性碰巧與實例變量具有相同的名稱。這不是衝突。該屬性的聲明只是代理實例變量的getter/setter方法的快捷方式。

更現代的對象 - 用法是這樣的:

@interface ClassWithProtocol : NSObject 

@property (retain) id<ProcessDataDelegate> delegate; 

- (void)startSomeProcess; 

@end 

你可以閱讀所有關於這個東西在Apple's Objective-C language documentation