0

私たちが持っている場合:

最初の方法は

MyClass.h

@interface MyClass : UIViewController{   

    IBOutlet UILabel* _label;  
    NSString    *myString; 
}

2番目の方法は

MyClass.m

@interface MyClass() {

    IBOutlet UILabel* _label;  
    NSString    *myString;
}

@end

私の質問は、最初の方法と 2 番目の方法の違いは何ですか。

2 番目の方法は、MyClass のプライベート変数を作成することです。最初の方法はどうですか。それは同じことをしますか、それともそうではありませんか。

この問題についてアドバイスをください

4

3 に答える 3

1

2つのうち、2番目の方法が優れています。最初の方法では、クラスのパブリック インターフェイスに内部実装の詳細を配置する必要があります。つまり、それらの詳細をクラスのユーザーに漏らしてカプセル化を破ります。

ただし、現在はさらに優れた 3 番目の方法があります。インスタンス変数を実装に入れることができます:

@implementation MyClass
{
@private
    IBOutlet UILabel* _label;  
    NSString    *myString;    
}

// method implementations

@end
于 2012-04-17T14:17:56.960 に答える
1

キーワードを使用@privateして、最初の例の変数を非公開にすることができます。これは、クラス拡張に変数を追加する主なポイントではありません。むしろ、拡張機能に ivar を追加すると、前方宣言を使用せずにヘッダーから不要な依存関係を削除できます。

たとえば、MySpecialClassが で定義されていて、プライベート変数としてMySpecialClass.h追加したいMySpecialClass *special場合、ヘッダーでそれを行うには、前方宣言または独自のヘッダー内にヘッダーを@class MySpecialClass含める必要があります。MySpecialClass.h一方、拡張機能に変数を追加すると (2 番目の方法) MySpecialClass.h実装の .m ファイルに含めることができ、前方宣言と不要なヘッダーの依存関係の乱雑さを回避できます。

于 2012-04-17T14:13:31.923 に答える
1

最初の方法は、ヘッダー ファイル MyClass.h で宣言する方法です。このクラスを使用する人は誰でも、常にヘッダー ファイルを持っているため、それらのインスタンス変数が表示されます。

実装ファイル MyClass.m で使用する 2 番目の方法です。したがって、内部にクラスがあり、.h ファイルのみを含むフレームワークを提供していただければ、MyClass クラスを使用できますが、インスタンス変数についてはわかりません。

于 2012-04-17T14:12:05.677 に答える