5

Xcode 4.4 より前のほとんどのプロジェクトでは、開発者が ivar と同じ名前のプロパティを同時に宣言していることに気付きました。例

@interface SecondViewController : UIViewController
{
     NSString *string;
}

@property (strong, retain) NSString *string;

だから私はなぜわからないのですか?

4

2 に答える 2

1

他の人を代弁することはできませんが、同じ名前は使用しません。インスタンス変数を宣言する場合は、先頭にアンダースコアが付いているため、インスタンス変数を参照しているのか、setter/getter メソッドを参照しているのかは明らかです。

Xcode 4.4+ では、インスタンス変数を宣言したり呼び出したりする必要はありません@synthesize。コンパイラは、先頭にアンダースコアを付けてインスタンス変数を自動的に作成し、setter/getter メソッドを提供します。

ただし、このメカニズムはあまり良い考えではないと思います。開発者が公開すべきではないクラスのプロパティを公開することを奨励するからです。

たとえば、これはBeginning iOS 6 Developmentから取得したものです。

@interface BIDViewController : UIViewController
@property (weak, nonatomic) IBOutlet UIButton *button;
- (IBAction)buttonPressed:(UIButton *)sender;
@end

一度にあまりにも多くの概念で初心者を混乱させたくないことは理解していますが、UIButtonオブジェクトとアクション メソッドの両方をこのビュー コントローラーのユーザーに公開することで、すぐにオブジェクト指向カプセル化に違反したことになり、どちらも公開してはなりません。 .

たとえば、クラスを使用してこれを行うとどうなりますか。

BIDViewController *vc = ...;
vc.button = nil;

また

vc.buttonPressed(mySegmentedControl);

すべての地獄が解き放たれます。プログラムを破る方法は 1000 通りあり、それらすべてを防御することはできませんが、すでに脆弱なシステムを作りたくはありません (Objective-C は、誰がプログラムを呼び出すことができるかできないかを定義するという点で貴重なものをほとんど提供しません。あなたの方法の)より弱い。

上記の実装は、どちらも Interface Builder によって尊重されるプライベート インスタンス変数とメソッドを使用して行う方が適切です。

@implementation BIDViewController ()
{
    IBOutlet UIButton *_button;
}
- (IBAction)_buttonPressed:(UIButton *)sender;

@end

クラスを使用すると、そのモデルを破るのが難しくなります。

しかしもちろん、これは開発者にとってはより多くのことを考えて入力する必要があるため、Apple は新しい機能を導入して、開発者がより短時間でやりたいことを実行できるようにしました (アウトレットをヘッダー ファイルにドラッグするだけで、ほとんど入力する必要はありません。宣言と実装のスケルトンが提供されています)。

于 2013-03-02T09:29:16.990 に答える