2

.h ファイルの @interface ブロックではなく、.m ファイルの @implementation 行のすぐ下で変数を宣言する Objective-C コードに遭遇しました。その後、それをプライベート ivar のように使用します。この方法で変数を宣言することに関するドキュメントを見つけることができなかったので、その影響を知りたいです。

例:

.h

@interface MyClass {
    @private
    int _myPrivInt1;
}
@end

.m

@implementation
int _myPrivInt2;
@end

質問:

これら 2 つの変数の技術的な違いは何ですか?

@private 修飾子を使用して .h @interface ブロックで ivar を宣言するのと同じですか、それとも C のグローバル変数に似ていますか?

このように変数を宣言する場合、何か影響はありますか?

それは避けるべきですか?

_myPrivInt2 のような変数を宣言するための用語はありますか?

4

1 に答える 1

3

インターフェイス ブロックでインスタンス変数を宣言する必要があります。

@implementation
int _myPrivInt2;
@end

このように変数を宣言すると、実際にはクラスの iVar が宣言されません。_myPrivInt2 はグローバル変数になり、extern 宣言を使用してコードの任意の部分からアクセスできます。

// SomeOtherFile.m
extern int _myPrivInt2;
...
_myPrivInt2 = 1000;

確認できます- SomeOtherFile.m のコードが実行された後、_myPrivInt2 変数は 1000 になります。

_myPrivInt2 に静的リンケージ指定子を指定して、現在の翻訳単位内でのみアクセスできるようにすることもできます

@implementation
static int _myPrivInt2; // It cannot be accessed in other files now
@end
于 2010-09-16T13:36:06.773 に答える