7

だから私は今日のインタビューでこれを尋ねられました、そしていくつかのグーグルの後でも答えを理解することができません(実際、私は[NSString文字列]メソッドを使用するコードをまったく見つけることができませんでした)。

違いは何ですか

  1. NSString *someString = [NSString string];
  2. NSString *someString = [[NSString alloc] init];

私の最初の考えは、[NSString string]自動解放されるオブジェクトを返すのに対し、allocとinitを使用すると保持されているオブジェクトを返すというものでした。しかし、この答えは間違っていたようです。

私はアップルドキュメントでNSStringクラスリファレンスを見てきましたが、それが言っているのは

Returns an empty string.

+ (id)string 

Return Value
An empty string.

誰かが私にこれら2つの違いが何であるかを正確に説明できますか?

4

5 に答える 5

5

それはあなたの回答でしたか、そしてなぜあなたの答えが間違っていたのか尋ねましたか?あなたの仮定は(より高いレベルで)ほとんど正しいので、私は尋ねます。

から返されたときに正確に「保持」されるわけではありませんalloc+init。これは、1つの参照を保持するオブジェクトであり、またはとバランスを取る必要がありreleaseますautorelease。便利なコンストラクター(+[NSString string])の場合、参照がゼロのオブジェクトが返されますが、明示的な保持を送信しない限り、現在の自動解放プールがポップされるまで存続することが期待できます(MRCまたはARCを想定しているため、タグ付きiOS)。

下位レベルでは、いくつかの推測を行うことができますが、多くのobjcインタビューでその質問を期待することはありません(中級または上級レベルであると言わない限り)。基本的に、これは実装で定義されていますが、どちらの形式も同じ静的定数を返すNSString可能性があります(インタビュアーが探していたものである可能性があります)。説明する:

@implementation NSString

static NSString * const EmptyNSString = @"";

- (id)init
{
    self = [super init];
    [self release];
    return EmptyNSString;
}

+ (id)string
{
    return EmptyNSString;
}

...

繰り返しますが、これは実装が定義されていますが、明らかな最適化です。また、その最適化により、具体的な不変型(NSString)を可変バリアント(NSMutableString)に対して物理的にサブクラス化することが困難になる場合があります。

于 2011-10-26T08:49:52.197 に答える
4

今、私の最初の考えは、[NSString string]自動解放されるオブジェクトを返すというものでした

技術的には、これは一定のプレースホルダー文字列です。つまり、プログラムの実行全体を通じて存続し、リリースされることはありません。自動リリースされた文字列ではありません。概念的には、これは私がインタビュアーとして焦点を当てるものです。これは、呼び出し元が所有していない文字列(空の文字列)であるため、呼び出し元はそれを解放しないでください。

一方、allocとinitを使用すると、保持されているオブジェクトが返されます

技術的には、これは一定のプレースホルダー文字列です。つまり、プログラムの実行全体を通じて存続します。実際、それは上記のものと同じオブジェクトであり、保持されません。概念的には、これは私がインタビュアーとして焦点を当てるものです。これは、呼び出し元が所有する文字列(空の文字列)であるため、呼び出し元は、不要になったときに解放する責任があります。

于 2011-10-26T08:56:11.713 に答える
4

正解は

NSString *someString = [NSString string];

所有しておらず、解放してはならない空の文字列を提供します(メモリ管理ルールに従って)

一方

NSString *someString = [[NSString alloc] init];

自分が所有し、解放する必要のある空の文字列を提供します(メモリ管理ルールに従って)。

実装を突っ込んでいなければ、これら2つの文字列について他にも言うことはできません。自動リリースされているとは言えません。自動リリースされていない可能性があり、保持カウントがどうなるかを言うことができないためです。

実際には、おそらく(どちらの場合も)NSStringサブクラスの定数オブジェクトへの同じポインターを取得します。このポインターの保持カウントはUINT_MAX、実行時に、定数の通常の保持解放動作を無効にするフラグとして使用されます。文字列。Objective-C SDKのメンテナ以外は誰も気にする必要がないので、私は実際に上記を試していません。

于 2011-10-26T09:04:17.960 に答える
0

あまり見かけません

NSString *someString = [NSString string]; 

と同じだから

NSString *someString = @""; 

短いです。これは通常、空のNSMutableStringを作成するために使用されます

NSMutableString* s = [NSMutableString string];
于 2011-10-26T08:53:36.083 に答える
0

私が想像できる唯一のことはそれです:

  1. allocで作成されていないため、メモリを割り当てません。これはシステムによって作成された定数(空の文字列)であり、解放する必要はありません。

  2. NSStringにメモリを自分で割り当てます。つまり、NSStringを使い終わったときに、NSStringがまだ「存続」しているかどうかを追跡する必要があるため、解放する必要があります。

于 2011-10-26T08:57:50.870 に答える