風格明智(和功能上,如果有任何區別),用於聲明私有方法,哪個更好?iPhone Obj-C:匿名類別或「私人」類別?
@interface MyClass()
@interface MyClass(private)
風格明智(和功能上,如果有任何區別),用於聲明私有方法,哪個更好?iPhone Obj-C:匿名類別或「私人」類別?
@interface MyClass()
@interface MyClass(private)
這兩種語法用於不同的目的。
命名類別 - @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
是,
有以下區別。
1)使用匿名類別需要在相應類的主@implementation塊中實現其方法;匿名類別允許您在除主類之外的其他位置聲明額外的API所需的API @interface塊
2)當使用MyClass(專用)時,必須考慮以下內容:必須考慮以下對象/類別對獨一無二。如果你在自己的班級申報私人類別,那就沒有問題了。但是,現有類的情況有所不同。例如,在給定的Objective-C命名空間中只能存在一個NSString(私有)類別。這可能會導致問題,因爲Objective-C命名空間是在程序代碼和所有庫,框架和插件之間共享的。這對Objective-C程序員編寫屏幕保護程序,首選項窗格和其他插件特別重要,因爲他們的代碼將被注入到他們無法控制的應用程序或框架代碼中。
你確定它是類必須唯一命名的情況下?我的理解是,只要選擇者是獨一無二的,就不會有衝突。運行時是否意識到類別? (運行時參考不提及它們) – rpetrich 2009-06-27 13:44:46
它不是必須唯一命名的類別:它是必須的對象/類別。嘗試自己編譯兩個不同的NSString(私有)類別,即使在您的項目中使用了不同的方法,看看它是否可行。 – 2009-06-27 16:59:16