2

いつも書くほうがいい

    @interface MyClass
    {
        NSTextField * myTextField ;
    }
    @property (assign)  NSTextField * myTextField ;

あるいは単に

    @interface MyClass
    {
        NSTextField * myTextField ;
    }

行を追加する必要があると考える理由がある理由@property

  • 最近、アウトレットにゲッター/セッターがないと機能しないプログラムがありました。

  • プラス:プロジェクトの作成時に次の行が見つかりました

    @property (assign) IBOutlet NSWindow *window;
    
4

3 に答える 3

3

propertyアウトレットオブジェクトまたはその他のオブジェクトのを作成するとすぐに、 (新しいコンパイラで)ivarが作成されます。

現在、ivarとプロパティの作成は廃止されています。property自動合成とのマッチングも可能です。

ivarが本当に必要な場合は、.mファイルに入れるか、プライベートにしたい場合は、それらを使用してクラスに拡張機能を追加します。

アウトレットにはセッター/ゲッターが必要です

はい、確かに何度もアクセスする必要があります。ラジオボタンの状態をチェックするのと同じように、チェックボックス、stringValueをNSTextFieldに設定する、[tableViewreloadData]でテーブルをリロードするなど。

@interface MyClass
    {
        NSTextField * myTextField ; //this is ivar
    }
    @property (assign)  NSTextField * myTextField ; //this is property
@end

あなたが入れたものは何でも.hアクセスpublic可能であり、それを隠したいのであれば.m、拡張機能内でもそれを行います。

于 2013-03-19T16:59:05.723 に答える
1

私は個人的に、オブジェクト参照スコープが必要な場合は、クラスの外でプロパティ宣言を行うことを好みます。それ以外の場合は、クラスブラケット内のインスタンス変数として宣言し、実装ファイル内で宣言します。(この変数機能をさらに継承しない場合)

それで、

  • クラスの外部で変数インスタンスにアクセスする必要がある場合は、プロパティを宣言します。MyClassViewController.hヘッダーファイル内

@property (strong, nonatomic) IBOutlet NSTextField *myTextField;

したがって、他のクラスでは、次の方法でこれにアクセスできます。

MyClassViewController *myClassViewController = [[MyClassViewController alloc] init];
[myClassViewController.myTextField setText:@"MyValue"];

また、次のような値を取得します

NSLog(@"%@", [myClassViewController.myTextField text]);
  • このようなパブリックアクセスは必要ないが、継承したい場合。次に、クラス宣言ブロック自体で宣言します。ViewController.hヘッダーファイル内

    @interface ViewController { @public: // or @protected
      NSString *myString;
    }
    

これで、ViewControllerクラスを継承する別のクラスがある場合、このプロパティは、アクセス指定子に従ってChildViewControllerに継承されます。

  • 完全に非表示のプロパティまたは変数が必要な場合。そのクラス自体の外部で使用されていないように、プライベートカテゴリ自体の実装ファイル(.m)で宣言できます。ViewController.mファイル:

@interface ViewController () {

  NSString *myString;
}

したがって、これは.mファイルでのみ表示され、他の場所では表示されません。

現在の宣言@property-setter-getterのデフォルトメソッド(setMyStringなど)が必要な場合にのみ、これを宣言する必要があります。これは、そのインスタンスの可視性要件に応じて、.hと.mの両方で宣言することもできます。

今、あなたがコンセプトを手に入れていることを願っています。そのすべては可視性についてです。

于 2013-03-19T17:26:48.803 に答える
1

必要なのは、を使用するInterfaceBuilderのプロパティだけですIBOutlet。Interface Builderを使用していない場合は、必要ありませんIBOutlet。Interface Builderを使用していない場合は、プロパティがまったく必要ない場合もあります(プロパティは通常パブリックですが、インスタンス変数は常にプライベートです)。

@interface MyClass : UIViewController

@property (assign) IBOutlet NSTextField *myTextField ;

インスタンス変数を作成したり、それを合成したりする必要はありません。

コード内でアクセスできますself.myTextField

于 2013-03-19T17:02:02.063 に答える