2009-06-27 82 views

回答

39

這兩種語法用於不同的目的。

命名類別 - @interface美孚(FooCategory) - 一般用於:

(1)延伸通過添加功能性的現有的類。示例:Foundation中的NSAttributedString擴展了AppKit中的一個類別,該類別添加了AppKit特定的RTF類文本格式API。 (2)聲明一組可能或可能不會由委託實現的方法。示例:各種類聲明 - 但不實現 - @interface NSObject(SetODelegateMethods)。

現在Form(2)已經不再受青睞,因爲@protocol已經擴展到支持Objective-C 2.0中的@optional方法。

類擴展 - @interface美孚() - 主要是讓你聲明額外的私有API - SPI或系統編程接口 - 用來實現類內臟。這通常出現在.m文件的頂部。任何在類擴展中聲明的方法/屬性都必須在@implementation中實現,就像在public @interface中找到的方法/屬性一樣。

類擴展還可用於在@綜合訪問器之前重新聲明公開只讀@property爲readwrite。

例子:

foo.h中

@interface Foo:NSObject 
@property(readonly, copy) NSString *bar; 
-(void) publicSaucing; 
@end 

Foo.m

@interface Foo() 
@property(readwrite, copy) NSString *bar; 
- (void) superSecretInternalSaucing; 
@end 

@implementation Foo 
@synthesize bar; 
.... must implement the two methods or compiler will warn .... 
@end 
2

是,

有以下區別。

1)使用匿名類別需要在相應類的主@implementation塊中實現其方法;匿名類別允許您在除主類之外的其他位置聲明額外的API所需的API @interface塊

2)當使用MyClass(專用)時,必須考慮以下內容:必須考慮以下對象/類別對獨一無二。如果你在自己的班級申報私人類別,那就沒有問題了。但是,現有類的情況有所不同。例如,在給定的Objective-C命名空間中只能存在一個NSString(私有)類別。這可能會導致問題,因爲Objective-C命名空間是在程序代碼和所有庫,框架和插件之間共享的。這對Objective-C程序員編寫屏幕保護程序,首選項窗格和其他插件特別重要,因爲他們的代碼將被注入到他們無法控制的應用程序或框架代碼中。

+0

你確定它是類必須唯一命名的情況下?我的理解是,只要選擇者是獨一無二的,就不會有衝突。運行時是否意識到類別? (運行時參考不提及它們) – rpetrich 2009-06-27 13:44:46

+0

它不是必須唯一命名的類別:它是必須的對象/類別。嘗試自己編譯兩個不同的NSString(私有)類別,即使在您的項目中使用了不同的方法,看看它是否可行。 – 2009-06-27 16:59:16