3

人はなぜ使うのか

@interface ViewController : UIViewController 
{
@private
    UIButton* button_;
}

パブリックヘッダーの @private 宣言? 実装内で変数を宣言しても同じ結果になりますね。私には奇妙に感じます。パブリック ヘッダーには本当にパブリック メンバーのみを含める必要があると思いました。保護されたメンバーをどうするか?

@implementation ViewController
    UIButton* button_;
@end

私が知っている唯一の違いは、この変数は現在のコンパイル単位 (.m ファイルですよね?) 内でのみ表示されるということです。

同じことがメソッドにも当てはまりますか?適切なメソッドの順序付けまたは前方宣言で問題なくコンパイルできました。private メソッドのカテゴリを宣言するのはなぜでしょうか? テスト目的のみですか?

4

4 に答える 4

7

ブロック内の変数宣言@implementationは、インスタンス変数ではなく、グローバル変数を作成します。インスタンス変数は、の一部として定義する必要があります@interface

カテゴリまたは拡張を使用して追加の@interfaceブロックを作成できますが、インスタンス変数ではなくメソッド宣言のみを含めることができます。

于 2009-10-16T13:42:39.740 に答える
4

プライベートなインスタンス変数を、おそらくパブリックなヘッダーに入れるのは「間違っている」と感じるかもしれませんが、私はそれについて心配する必要はありません。

Cocoa クラスのほとんどすべてのヘッダー ファイル (クラスター クラスを除く) を見てみると、Apple が公開ヘッダー ファイルでインスタンス変数を宣言していることがわかります。

Apple はそれで問題ないので、あまり心配する必要はないと思います。=)

参考までに: すべてのインスタンス変数はデフォルトで保護されています。

于 2009-10-16T15:19:25.083 に答える
3

同じことがメソッドにも当てはまりますか?

いいえ、メソッドはプログラムのどの部分からも見えます。セレクターがわかっている場合は、呼び出すことができます。

適切なメソッドの順序付けまたは前方宣言で問題なくコンパイルできました。private メソッドのカテゴリを宣言するのはなぜでしょうか? テスト目的のみですか?

プライベート カテゴリは、前方宣言の形式です。それらは C のプロトタイプであるかのように考えることができます。

アンドリュー

于 2009-10-16T21:13:15.633 に答える
0

@private は iVar のみを参照しています。

デフォルトでは、次のようにインスタンスの ivar にアクセスできます。id iShouldNotDoThis = foo->bar;

@private は、そのような ivar にアクセスできず、アクセス メソッドを使用する必要があることを意味します。

id thisIsBetter = [foo bar];

プライベート カテゴリやメソッドとは関係ありません。

于 2009-10-16T13:35:43.763 に答える