2

これら 2 つの Objective-C ステートメントの違いは何ですか?

NSData *documentBytes = [NSData dataWithContentsOfFile:filePath];

これに対して:

NSData *documentBytes = [NSData initWithContentsOfFile:filePath];

Apple の NSData Class Reference ページから、それぞれについて次のように述べています。

dataWithContentsOfFile - 指定されたパスで指定されたファイルからすべてのバイトを読み取ることにより、データ オブジェクトを作成して返します。

initWithContentsOfFile - 指定されたパスで指定されたファイルからデータを読み込むことによって初期化されたデータ オブジェクトを返します。

私には、これらは機能的に同等のように見えますが、すべての場合で同じことを行うとは思えませんよね?

前もって感謝します... -エルギン

4

2 に答える 2

4

を使用するときはinit、常に次allocのように使用する必要があります。

NSData *documentBytes = [[NSData alloc] initWithContentsOfFile:filePath];

これにより、保持カウントが 1 の NSData オブジェクトが返されます。これで参照を所有し、それを解放する責任があります。

使用時dataWithContentsOfFile

NSData *documentBytes = [NSData dataWithContentsOfFile:filePath];

自動解放された NSData オブジェクトが返されます。それを使用して忘れることができます。自動解放プールがそれを処理します。保管したい場合は、保管する必要があります。

もちろん、ARC を使用している場合は、このすべてを忘れることができます ;-)、メソッドは本質的に同じです。

于 2013-05-24T23:05:58.370 に答える
0

二番目

NSData *documentBytes = [NSData initWithContentsOfFile:filePath];

最初に割り当てる必要があるため、コンパイルされません。次のようになります。

NSData *documentBytes = [[NSData alloc] initWithContentsOfFile:filePath];

しかし、どちらも同じように機能し、最終的にはファイルの内容を持つ NSData が得られます。1つ目はショートカットです。

だからあなたの疑問について:

オブジェクトを最初に割り当てる必要のない最初のものは、メソッドがオブジェクトを返します.ARCを使用していない場合(私はそうは思いません)、最初のものはシステムが処理するオブジェクトを返します.

最初にオブジェクトを割り当てる必要がある 2 番目のメソッドは、オブジェクトを初期化するだけであり、ARC を使用していない場合は、オブジェクトを解放するように注意する必要があります。

于 2013-05-24T23:00:14.650 に答える