5

私は Ruby から Objective-C に移行し、次のことを続けています。

NSObject *foo;

@property (nonatomic,retain) NSObject *foo;

.h ファイルで、次に .m ファイルで:

@synthesize foo;

上部と

[foo release]

解放中。

追加は4ステップfoo!ベテランの Objective-C プログラマーは、クラスに新しいインスタンス変数を追加するたびに、4 つの手順すべてを手動で行うのでしょうか? これをDRYにする方法がありませんか?

4

6 に答える 6

6

これは、C++ でも共通の懸念事項です (宣言が 2 倍になりますが、多少異なります)。簡単に言えば、それは言語がどのように構築されているかということです。各ステートメントは一意であり、独自の目的があるため、実際には DRY に反するものではありません。ただし、今日の基準からすると非常に冗長であることは確かです。

于 2009-07-31T21:52:09.233 に答える
3

このページhttp://pragprog.com/magazines/2010-07/not-quite-new-in-ios-は、変数宣言を削除して、2回の繰り返しに減らすことができると主張しています:)

#import <UIKit/UIKit.h>
@interface MoveMeViewController : UIViewController {
}

@property(nonatomic, retain) IBOutlet UIImageView *imageView;
@end
于 2010-09-27T04:12:07.483 に答える
1

Objective-C は初めてだとおっしゃっていたので、クラス内のすべてのインスタンス変数のプロパティを作成する必要はないことを認識していただきたいと思います。実際、そうすべきではありません。

プロパティは、クラスが他のクラスに提供するインターフェイスを表します。このインターフェイスは、クラスの内部実装と必ずしも一致しません。それらが同じ場合、宣言されたプロパティの構文により、それを (比較的) 簡単に表現できます。

クラスがプロパティを介して内部状態のほとんどを公開している場合は、その設計を詳しく調べて、責任を移動することでより単純な設計が得られるかどうかを確認することをお勧めします。

于 2009-08-01T01:02:34.960 に答える
0

はい、そうですが、XCodeが自動化するためのスクリプトなどを毎日誰かが思いつくことを願っています。(私も好きです

self.foo = nil 

私のdeallocsで)

于 2009-07-31T22:51:23.780 に答える
0

64ビットランタイムはインスタンス変数を合成できるため、32ビットコンピューターを忘れた場合は、インスタンス変数とプロパティの両方を宣言する必要がなくなります。しかし、ヘッダーファイルで宣言し、別のファイルで実装する必要がある言語では、完全にDRYになることはできません。言語は複製が必要です。回避する唯一の方法は、メタ言語を作成することです。

スクリプトを使用して、同じ変数ボイラープレートを何度も入力する重複をなくすことができますが、それでもコードには残ります。

ちなみに、@synthesizeステートメントは重複した情報ではないと思います。コード内の他の何も、プロパティで取得するために使用されるアクセサーを示していません。

于 2009-07-31T22:54:31.730 に答える
0

Objective-C は、C の上にある非常に薄いレイヤーです。低レベルでは、ほとんどの「目的」のものは、C コンパイル プロセスに挿入されるコード ポインタにコンパイルされます。

彼らは参照カウント (最も基本的なガベージ コレクション システム) を追加しましたが、その性質上、すべて手作業で行われるため、"Release" 呼び出しが行われます。

iPhone 以外のバージョンには実際のガベージ コレクション システムが追加されていますが、解放がそれほど決定論的ではないため、縮小もされていません。

オブジェクトを小さく集中的に保ち、プロパティの構文があまり侵略的であってはなりません。

于 2009-07-31T22:43:58.083 に答える