通常、プライベートプロパティの宣言には、.mファイルで空白のカテゴリを使用する必要があります。
// APXCustomButton.m file
@interface APXCustomButton ()
@property (nonatomic, strong) UIColor *stateBackgroundColor;
@end
// Use the property in implementation (the same .m file)
@implementation APXCustomButton
- (void)setStyle:(APXButtonStyle)aStyle
{
UIColor *theStyleColor = ...;
self.stateBackgroundColor = theStyleColor;
}
@end
.mファイルの外部の黒いカテゴリで宣言されたプロパティにアクセスしようとすると、宣言されていないプロパティコンパイラエラーが発生します。
- (void)createButton
{
APXCustomButton *theCustomButton = [[APXCustomButton alloc] init];
theCustomButton.stateBackgroundColor = [UIColor greenColor]; // undeclared property error
}
ほとんどの場合、サブクラス化せずに既存のクラスに新しいメソッド/プロパティを追加する場合は、.hファイルでカテゴリを宣言し、.mファイルで宣言されたメソッドを実装する必要があります
// APXSafeArray.h file
@interface NSArray (APXSafeArray)
- (id)com_APX_objectAtIndex:(NSInteger)anIndex;
@end
// APXSafeArray.m file
@implementation NSArray
- (id)com_APX_objectAtIndex:(NSInteger)anIndex
{
id theResultObject = nil;
if ((anIndex >= 0) && (anIndex < [self count]))
{
theResultObject = [self objectAtIndex:anIndex];
}
return theResultObject;
}
@end
これで、「APXSafeArray.h」がインポートされる場所ならどこでも「com_APX_objectAtIndex:」メソッドを使用できます。
#import "APXSafeArray.h"
...
@property (nonatomic, strong) APXSafeArray *entities;
- (void)didRequestEntityAtIndex:(NSInteger)anIndex
{
APXEntity *theREquestedEntity = [self.entities com_APX_objectAtIndex:anIndex];
...
}