0

私はObjCとiPhoneの初心者です。

複数のビュー間でのデータ共有の例をダウンロードしました。基本的なアプローチは、ベースUIApplicationでデータモデルオブジェクトを作成し、そこからデータを取得/設定することです。したがって、initメソッドで次のコードが表示されました。


- (id) init;
{
    self.theAppDataObject = [[ExampleAppDataObject alloc] init];
    [theAppDataObject release];
    return [super init];
}

その後、デリゲートを使用して、このオブジェクトにアクセスできます。


id theDelegate = (id) [UIApplication sharedApplication].delegate;
    ExampleAppDataObject* theDataObject;
    theDataObject = (ExampleAppDataObject*) theDelegate.theAppDataObject;

だから、私の質問は最初のコード例にあります。AppDataObjectオブジェクトにメモリを割り当て、その直後にオブジェクトを解放する必要があるのはなぜですか?後でこのオブジェクトにアクセスするときにnilを取得しないのはなぜですか?

10倍

4

4 に答える 4

5

theAppDataObjectとして宣言されていると思い@property (retain)ます。したがって、self.theAppDataObject(または[self setTheAppDataObject:])を実行してオブジェクトを設定する場合、このプロパティは。を保持しExampleAppDataObjectます。したがって、後でリリースできます。

ExampleAppDataObjectを割り当てて初期化すると、保持カウントが1になります。AppDataObjectをこのExampleAppDataObjectに設定すると、保持カウントが2になります。その後、オブジェクトの所有権を解放できます。 ; AppDataObjectにはまだ所有権があるため、割り当てが解除されることはありません。

それが理にかなっている場合。

于 2011-08-05T11:49:05.463 に答える
1

これは、AppDataObjectプロパティがどのように定義されているかによって異なります。それが保持セッターアクセサーを提供する場合、appDataObjectの保持カウントは2に反転し、ここで必要な数より1つ多くなります。

だからそれの1つを解放します。

より良く、より理解しやすい方法は、書くことです

if ( (self = [super init]) ) {
    ExampleAppDataObject *myAppDataObject = [[ExampleAppDataObject alloc] init];
    self.theAppDataObject = myAppDataObject;
    [myAppDataObject release];
}

return self;
于 2011-08-05T11:52:21.577 に答える
1

Iphoneは、参照カウントベースのメモリ管理モデルを使用します。最初にこのチュートリアルを参照し、次にアップルの技術文書を参照してください... theAppDataObjectは、上記のコードが機能するために保持する必要があるプロパティです(self。theAppDataObjectの使用を参照)。保持されると、ボーナスに1の保持カウントが加算されます...オブジェクトは、保持カウントがゼロになったときにのみ解放されます。

于 2011-08-05T11:54:36.400 に答える
0

まず最初に:そのコードサンプルはひどいです。

- (id) init
{
    // assign self. super may return another address
    self = [super init];
    // then check for nil
    if (self != nil) {
            // then assign the ivar directly because you should
            // not invoke methods of partially constructed objects
        theAppDataObject = [[ExampleAppDataObject alloc] init];
    }
    // then return the address super returned
    return self;
}

今あなたの質問のために:

AppDataObjectオブジェクトにメモリを割り当て、その直後にオブジェクトを解放する必要があるのはなぜですか?

self.theAppDataObjectを保持、コピー、または割り当てるセッターを介して呼び出しますtheAppDataObject。この場合、保持される可能性が高いと考えられます。

後でこのオブジェクトにアクセスするときにnilを取得しないのはなぜですか?

releaseポインタをnilに設定しません。オブジェクトにメッセージを送信し、オブジェクトは保持カウントを減らします(通常の場合)。この場合に予想したのは、割り当てが解除されたオブジェクトです。表示したプログラムで参照カウントがゼロに達しないため、引数が保持されている場合は発生しません。self.theAppDataObject = argオブジェクトは保持され、setter( )が呼び出されたときにオブジェクトのアドレスが格納されるため、オブジェクトはまだ存続しています。

于 2011-08-05T12:04:36.197 に答える