簡體   English   中英

Objective-C中的類別用法

[英]Category usage in Objective-C

我看到一些我繼承的代碼如下所示:

@interface SomeClass (private)

這是在SomeClass.m中的實現文件。 有一個附帶的頭文件,不建議該類使用類別。 在這種情況下, (private)只是給SomeClass的類別一個不好的名字嗎? 我假設在實現中指定類似這些類別是完全合法的嗎?

它不是私有的名稱“私人”; 這些方法是私有的,因為它們屬於在實現文件中聲明的類別。

類別有三種用法,每種用法都向類添加方法(注意:僅限方法,而不是iVars)

擴展現有的Cocoa類

這允許您將自己的方法添加到現有類。 例如,如果要擴展NSString以應用特殊大小寫,則可以創建一個名為NSString + Capitals的新類。 在NSString + Capitals.h中你會得到:

@interface NSString (Capitals)

-(NSString *)alternateCaps:(NSString *)aString;

@end

在NSString + Capitals.m中,您將實現該方法

@implementation NSString (Capitals)
-(NSString *)alternateCaps:(NSString *)aString
{
    // Implementation
}

類上的私有方法

這與上面相同,只是在實現文件中聲明和定義了額外的方法(.m)通常是一種擁有私有方法的方法 - 因為它們不在.h文件中(這是其他#imported)他們根本不可見。 在這種情況下,方法的實現在它們自己的實現塊中完成。 例如

// someClass.m
@interface someClass (extension)
-(void)extend;
@end

@implementation someClass
    // all the methods declared in the .h file and any superclass
    // overrides in this block
@end

@implementation someClass (extension)
-(void)extend {
    // implement private method here;
}

類擴展 (10.5 Leopard的新功能)

一種更簡單的私有方法。 在這種特殊情況下,類別名稱為空,並且私有方法在與所有其他類方法相同的塊中實現。

// someClass.m
@interface someClass ()
-(void)extend;
@end

@implementation someClass
    // all the methods declared in the .h file and any superclass
    // overrides in this block
    // Implement private methods in this block as well.
-(void)extend {
    // implement private method here;
}

@end

這是Apple類別和擴展文檔的鏈接

“私有”只是一個名稱,表明方法不是公共的,並且用於類的內部實現,但是在類別的聲明中沒有任何內容強制執行。

此外,類別中定義的方法會在運行時添加到類定義中,因此附帶的頭文件無需聲明它正在使用類別 - 它會自動“使用”。

我用它來給我一個聲明(因此文檔,以及關閉編譯器)的輔助方法,而不需要在公共接口中。 然后,除了使用頭文件中定義的方法之外,該類的“消費者”(默認,除了良好的方式之外沒有什么能阻止它們)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM