1

クラス メソッドとインスタンス メソッドを使用してオブジェクトを初期化する場合、パフォーマンスに違いはありますか?

Apple のドキュメントでは、NSArray クラスで次のように表示されます (このスタイルは他のクラスでも見られます)。

+ (id)arrayWithContentsOfFile:(NSString *)aPath
- (id)initWithContentsOfFile:(NSString *)aPath

各メソッドの説明は非常に似ています。

  • 性能差はありますか?
  • 一方が他方よりも優れていますか?
  • どちらも (パフォーマンスの点で) 同じである場合、
    一方の方法を他方よりも優先して使用することはありますか?

ちょっと興味があるんだけど。:P

4

4 に答える 4

0

性能差はありますか?一方が他方より優れているか?

そうではありませんが、それらを使用する場所と周囲のコンテキストが何であるかに正確に依存します.

どちらも (パフォーマンスの点で) 同じである場合、一方の方法を他方よりも優先して使用することはありますか?

主に個人的な好み。違いは、メモリ管理に関するものです。クラス メソッドは自動解放されたインスタンスを返しますが、zoneそれが割り当てられている を制御することはできません。インスタンス メソッドを使用すると、これらを制御できます。

一般的に、そして歴史的に、iOS では、作成されたインスタンスによって使用されたメモリが、プールが空になるまで放置されるのではなく、完了したときにすぐにクリーンアップされるようにするため、自動解放されたメソッドを避けます (通常はそれがいつになるかは正確にはわかりません)。ただし、ARC はこの懸念を軽減します。

于 2013-07-26T13:42:46.793 に答える
0

唯一の大きな違いは、自動解放されたオブジェクトを提供するものと提供しないものがあることです。

自動解放されたオブジェクトは、プールが解放されるまでプールに残ります。
自動解放されていないオブジェクトを使用するのが大好きです。そのオブジェクトを使い終わったら、いつでも解放するだけです。つまり、いつでも alloc-init オブジェクトを破棄できます。このオブジェクトの参照が必要なだけです。

//case 1:
for (int i = 0; i<1000; i++) {
    NSArray *array = [[NSArray alloc] initWithContentsOfFile:@"path"];
    //Do something with array
    [array release];
}

//case 2:
for (int i = 0; i<1000; i++) {
    @autoreleasepool {
        NSArray *array = [NSArray arrayWithContentsOfFile:@"path"];
        //Do something with array
    }
}

//case 3:
@autoreleasepool {
    for (int i = 0; i<1000; i++) {
        NSArray *array = [NSArray arrayWithContentsOfFile:@"path"];
        //Do something with array
    }
}

配列が 1KB だとすると、オブジェクトがすぐに解放されるため、最初の 2 つのケースでは 1KB のピークが表示されます。3 番目のケースでは、メモリのピークが 1000KB に達し、自動解放されたプールが解放された後にゼロに戻ります。

したがって、コーディング方法によって異なります。

于 2013-07-26T13:53:19.490 に答える
0

class methodaと anの違いはinstance method、インスタンス メソッドには、(一般に) 動作するクラスのインスタンスが必要であるということです。インスタンス メソッドを呼び出すメッセージは、クラスのインスタンスに送信する必要があります。

For example Cocoa の NSString クラスには、stringWithSomethingOrOther という名前のクラス メソッドがいくつかあります。これにより、新しい NSString オブジェクトが作成され、返されます。

一方、NSStringには多くのインスタンス メソッドあります。つまり、操作する実際のインスタンスがなければ意味のない操作です。一般的に使用されるのは、メッセージが送信される特定の NSString インスタンスに含まれる文字数を示す長さメソッドです。

別の例を考えてみましょう -

@interface DeepsClass : NSObject 

+ (void)myClassMethod; 
- (void)myInstanceMethod; 

@end

次のように使用できるようになりました: -

[DeepsClass myClassMethod]; 

DeepsClass *object = [[DeepsClass alloc] init]; 
[object myInstanceMethod];

Performance difference

パフォーマンスはalmost the same、クラス メソッドとインスタンス メソッドにあります。クラス メソッドは実行時に他のメソッド (インスタンス メソッドなど) と同様に処理されます。クラスは実行時にロードされる場合がありますが、メソッド自体はインスタンス メソッドと同じ C 関数であり、これらの関数への POINTERS はキャッシュされます。インスタンスメソッド。

于 2013-07-26T13:37:10.847 に答える