-1

ご存知のように、通常はクラスヘッダーファイル(.h)でクラスインスタンス変数、プロパティ、メソッド宣言を宣言していました。

ただし、.mファイルでは、空白のカテゴリを使用して同じことを行うことができます。

だから私の質問は:.hファイルで何を宣言する必要があり、.mファイルで何を宣言する必要があるのか​​-そしてその理由は?

よろしく、Mrunal

新しい編集:

こんにちは、みんな、

新しく追加されたAppleの例をdeveloper.apple.comで参照すると、それらは.mファイル自体でIBOutletsとIBActionsを宣言しており、それもプロパティ宣言で宣言しています。ただし、クラスプライベートメンバーセクションの.hファイルでこれらの参照を宣言することで同じことを実現できます。

では、なぜ彼らはそれらを.mファイルで、プロパティとして宣言しているのでしょうか。

-Mrunal

4

4 に答える 4

2

ただし、.mファイルでは、空白のカテゴリを使用して同じことを行うことができます。

クラスの続き。

通常、公開することを目的としている場合は、ヘッダーで何かを宣言することを選択します。これは、任意のクライアントによって使用されます。他のすべて(あなたの内部)は通常、クラスの継続に入る必要があります。

私はカプセル化を好みます-これが私のアプローチです:

変数

クラス継続またはに属し@implementationます。例外は非常にまれです。

プロパティ

通常、実際にはクラス継続に属します。サブクラスにこれらをオーバーライドする機能、またはこれらをパブリックインターフェイスの一部にする機能を提供する場合は、クラス宣言(ヘッダーファイル)でそれらを宣言できます。

メソッド宣言

クラス宣言よりもクラス継続の方が多い。繰り返しますが、それが任意のクライアントによって使用されることを意図している場合、それはクラス宣言に属します。多くの場合、クラス継続での宣言(またはクラス宣言)も必要ありません。プライベートの場合は、定義だけで十分です。

于 2013-02-28T11:51:01.687 に答える
1

基本的に、ヘッダーファイル(.h)でパブリックAPIを宣言し、実装ファイル(.m)でプライベートAPIを宣言します。

Objective-Cでの可視性

ここで答えを見つけることもできます

于 2013-02-28T11:42:05.730 に答える
0

通常、プライベートプロパティの宣言には、.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];
    ...
}
于 2013-02-28T11:53:57.190 に答える
0

それは主にあなた次第です。

この.hファイルは、クラスの説明のようなものです。特に他の開発者と協力している場合は、クラスの外部から見えるようにするために本当に重要なもの
だけをファイルに入れるのが賢明です。.h

使用できないメソッド/プロパティ/変数のリスト全体を用意するのではなく、使用できるメソッド/プロパティ/変数をより簡単に理解するのに役立ちます。

于 2013-02-28T11:34:08.117 に答える