1

次のようなクラスメソッドを使用することで、メモリ/パフォーマンスの欠点があるのか​​、それとも一般的な欠点があるのか​​疑問に思いました。

+ (void)myClassMethod:(NSString *)param {
// much to be done...
}

また

+ (NSArray*)myClassMethod:(NSString *)param {
// much to be done...
    return [NSArray autorelease];
}

特にメモリ管理(iPhone)を扱う必要がある環境では、クラスメソッドに多くの機能を配置すると便利ですが、通常、何か便利な場合に問題がありますか?

例としては、非常に単純な機能を備えた多数のクラスで構成された考え抜かれたWebサービスがあります。すなわち

TomorrowsXMLResults;
TodaysXMLResults; 
YesterdaysXMLResults;
MondaysXMLResults;
TuesdaysXMLResults;
.
.
.
n

これらを大量にWebサービスクラスに収集し、Webサービスクラスをインスタンス化して、このクラスのメソッドに「結果」クラスのクラスメソッドを呼び出させます。クラスは単純ですが、大量のXmlを処理し、多くのオブジェクトをインスタンス化します。

クラスメソッドが存在するのか、それともスタックやメモリ内でインスタンス化されたオブジェクトへのメッセージとは異なる方法で処理されるのかを尋ねていると思いますか?

それとも、それらは単にインスタンス化され、舞台裏で再びプルダウンされるので、数行のコードを節約する方法にすぎませんか?

4

2 に答える 2

10

簡単な答え:欠点はありません-期待どおりに使用してください

長い答え:objective-cのクラスは実際にはオブジェクトであり、他のクラスと同じように使用できます(-[NSObjectクラス]の戻り型を確認してください-obj-cオブジェクトへのポインター)。[yourclass alloc]を呼び出すと、実際には、ランタイムにクラスを説明するオブジェクトであるyourclassにメッセージが送信されます。(メソッド自体はmalloc()のラッパーの集まりであるため、魔法はまったく含まれていません。)これらのオブジェクトの処理方法に関しては、クラスを含むobjc内のすべてのオブジェクトがヒープに割り当てられるため、スタックは再生されます。パーツなし。編集:明確にするために、インスタンスメソッドとは対照的にクラスメソッドを使用することに違いはありませんが、クラスメソッドではクラスのインスタンスを持っている必要はありません。

これらのクラスオブジェクトの実装方法の詳細については、http://www.sealiesoftware.com/blog/archive/2009/04/14/objc_explain_Classes_and_metaclasses.htmlをお勧めします。

于 2010-04-22T22:15:08.987 に答える
0

私の経験では、クラスメソッド、または私の定義では静的関数は特定の目的を果たします。それらの1つはパフォーマンスである可能性がありますが、それらが小さく、大量のデータを処理しない場合に限ります。(つまり、NSString stringWithString)。大量のデータを処理している場合、おそらくご存知のように、パフォーマンスへの影響は、オブジェクトのインスタンス化ではなく、データの処理にあります。タスクを処理するためのオブジェクトを作成するオーバーヘッドではなく、時間のかかるタスクの処理に集中することに固執します。

特定の回答:クラスメソッドはロード時にロードされ、アプリケーションで常に利用できます。クラスのインスタンス化を介してそれらをロードするためのコードオーバーヘッドは、説明する大量の作業と比較して最小限です。(とにかくキャッシュされる可能性が高いです)

于 2010-04-22T20:59:35.627 に答える