0

私は自分のプロジェクトをxcode4.2(古いバージョン)で行っています。私のアプリケーションでは、アプリのライフサイクル全体で使用するために、変数、配列をdtoクラスに設定するだけです。だから私はこのようなプロパティで設定しました。

AppDTO(NSObjectのサブクラス)

AppDTO.h

@property(nonatomic,retain)anotherAppDTO *aAppDTO;
@property(nonatomic,retain)NSMutableArray *array1;
@property(nonatomic,retain)NSMutableArray *array2;
@property(nonatomic,retain)NSString *string1,*string2,*string3;

AppDTO.m

- (id)init
{
    self = [super init];
    if (self) {

    self.aAppDTO = [[anotherAppDTO alloc]init];
    self.array1 = [[NSMutableArray alloc]init];
    self.array2 = [[NSMutableArray alloc]init];

    self.string1 = @"Hello";
    self.string2= @"Hai";

    }
}


-(void)dealloc
{
    if(array1 != nil)
    {
        [array1 release];
        array1 = nil;
    }

    if(array2 != nil)
    {
        [array2 release];
        array2 = nil;
    }

    [aAppDTO release];
    aAppDTO = nil;

    [super dealloc];
}

Xcode 4.3.2でアプリを分析すると、self.array1とself.array2でメモリ警告が表示されます(ラインに割り当てられたオブジェクトのリークの可能性があります…。)が、self.array1をarray1に変更すると、警告が消えます。

自己を使用する理由は何ですか。@property(nonatomic、retain)を変数(array1、array2、string1、string2など)に設定した場合、selfを使用する必要がありますか?

また、deallocメソッドでは、[self.array1 release]を使用したくないと聞きましたが、代わりに[array1release]を使用できます。それが正しいか?

Deallocメソッドで文字列を解放する必要がありますか?

また、deallocメソッドでaAppDTOをリリースしています。別のAppDTOクラスにいくつかのオブジェクトを割り当てた場合、[aAppDTOrelease]メソッドを呼び出すと自動的に解放されますか。

誰かが私を明確にすることができますか?

どうもありがとう、アニッシュ

4

3 に答える 3

4

あなたが書くときあなたは警告を受け取ります:

self.array1 = [[NSMutableArray alloc]init];

と同じです:

[self setArray1: [[NSMutableArray alloc]init]];

array1基になるプライベート変数を割り当てていないことに気付くかもしれませんが、プロパティのセッターを呼び出しています。これは、保持 として宣言されているため、割り当てられたオブジェクトを保持するため、最終的に別のオブジェクトを2回目に割り当てることを意味します。セッターの最初のオブジェクトは、アプリケーションが閉じられるまで1の保持カウントで残ります(そのオブジェクトへの参照がもうないため...)。

このすばらしい記事を見て、Objective-Cでの手動参照カウントをよりよく理解してください。

于 2012-08-12T07:30:56.333 に答える
2

Xcode 4.3.2でアプリを分析すると、self.array1とself.array2でメモリ警告が表示されます(ラインに割り当てられたオブジェクトのリークの可能性があります…。)が、self.array1をarray1に変更すると、警告が消えます。

アナライザーの権利。パラメータはretain設定時に編集されます。同様に、初期化とで直接アクセスを優先する必要がありますdealloc。だから、あなたはただ書くべきでarray1 = [[NSMutableArray alloc] init];あり、そして行われるべきです。

自己を使用する理由は何ですか。@property(nonatomic、retain)を変数(array1、array2、string1、string2など)に設定した場合、selfを使用する必要がありますか?

それらはアクセサメソッドを通過します。初期化中またはdeallocではない場合は、アクセサメソッドを使用することをお勧めします。これは、完全に構築されたオブジェクトの一般的な正しい実行パスであるためです。

また、deallocメソッドでは、[self.array1 release]を使用したくないと聞きましたが、代わりに[array1release]を使用できます。それが正しいか?

正しい。

Deallocメソッドで文字列を解放する必要がありますか?

はい。

また、deallocメソッドでaAppDTOをリリースしています。別のAppDTOクラスにいくつかのオブジェクトを割り当てた場合、[aAppDTOrelease]メソッドを呼び出すと自動的に解放されますか。

参照カウントが0に達するdeallocと、が呼び出されます。

于 2012-08-12T07:34:43.460 に答える
0

他の人があなたの質問に答えたと思います。

Appleの優れたAdvanceMemoryManagementプログラミングガイド:Practical Memory Managementに注目したいと思います。このガイドでは、この種のシナリオについて説明しています。最初の読書でそれをすべて取り入れることは難しいです、しかしそれは本当にこのことをカバーします。インスタンス変数とアクセサメソッドの使用に関する質問への回答として、「イニシャライザメソッドとdeallocでアクセサメソッドを使用しない」というラベルの付いたセクションに注目します。

于 2012-08-12T09:05:49.070 に答える