Objective-C分類(category)と拡張(Extension)


1、分類(category)
Object-Cの分類を使用すると、クラスにメソッドを追加することで拡張できます(ただしcategoryでは新しいインスタンス変数を追加できません)、クラスのコードにアクセスする必要がなく、javascriptでプロトタイプを使用して属性を定義するのと少し似ています.
コードでクラス定義を編集することなく、クラスに新しいメソッドを作成できます.
以下に分類を定義して使用する例プログラムを示します.次のコードでは、Object-CのNSStringにcamelCaseString分類を追加し、camelCaseStringメソッドを使用すると、文字列のスペースを削除し、元のスペースの単語を大文字に書き換えることができます(文字列をアルパカ式に変換します).
#import <Foundation/Foundation.h>

/*
                  :
	   、            ,      
 
	   、                    ,        
 */
//NSString             ,         。
//CamelCase           。
//      ,      。
//       :ClassName+CategoryName.h
@interface NSString (CamelCase)

-(NSString*) camelCaseString;

@end

@implementation NSString (CamelCase)

-(NSString*) camelCaseString
{
    //  NSString            。
    //self         。
    NSString *castr = [self capitalizedString];
	
    //          ,             。
    NSArray *array = [castr componentsSeparatedByCharactersInSet:
                      [NSCharacterSet whitespaceCharacterSet]];
	
    //        
    NSString *output = @"";
    for(NSString *word in array)
    {
        output = [output stringByAppendingString:word];
    }
	
    return output;
	
}

@end
int main (int argc, const char * argv[])
{
	
    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
	
    NSString *str = @"My name is bill.";
    NSLog(@"%@", str);
    str = [str camelCaseString];
    NSLog(@"%@", str);
	
    [pool drain];
    return 0;
}

2、拡張(Extension)
拡張については、拡張は匿名の分類であることを理解することができます.しかし匿名分類とは異なり,拡張は新しいインスタンス変数を追加できる(拡張は一般的ではないほど強くなったと思うのではないか^^)
Xcode 4以降はカスタムクラスの.mファイルに拡張を使用することを推奨し、プライベートインタフェースを外部に露出させないようにコードパッケージ性を確保します.
次に拡張例を示します.
@interface MyClass : NSObject
- (float)value;
@end
 
 
@interface MyClass () { //    :  
    float value;
}
- (void)setValue:(float)newValue;
@end
 
@implementation MyClass
 
- (float)value {
    return value;
}
 
- (void)setValue:(float)newValue {
    value = newValue;
}
 
@end