1

このメモリ リーク エラーの追跡に問題がありますPotential leak of an object allocated on line...

@interface BNPieChart : UIView {
@private
    NSMutableArray* slicePointsIn01;
}

m
- (id)initWithFrame:(CGRect)frame {
    if (self = [super initWithFrame:frame]) {
        [self initInstance];
        self.frame = frame;        
        slicePointsIn01 = [[NSMutableArray alloc]
                       initWithObjects:nFloat(0.0), nil];       

- (void)initInstance {
    slicePointsIn01 = [[NSMutableArray alloc]
                       initWithObjects:nFloat(0.0), nil];

プロパティ/合成/割り当て解除を追加しようとしましたslicePointsIn01が、これにより同じエラーが発生します。

私は何を間違っていますか?

4

1 に答える 1

4

slicePointsIn01は 2 つの異なるオブジェクトに設定されます。1 つは でinitInstance、もう 1 つは後で で設定されinitWithFrame:ます。

最初allocのオブジェクトは 'd オブジェクトに設定されていたため、そのオブジェクトはrelease割り当てを変更する前には存在しなかったため、元のオブジェクトがリークされます。

プロパティを追加する場合は、インスタンス変数を直接使用するのではなく、実際に使用していることを確認する必要があります。これを行うには、次の 2 つの方法のいずれかで割り当てを行います。

self.myProperty = //something;
[self setMyProperty: //something];

注(@Andréに感謝):somethingプロパティがオブジェクトを保持するため、割り当て時にオブジェクトの保持カウントが0であることを確認してください(つまり、通常は自動解放されます)。

//NOT like this:
myProperty = //something;

この行は、インスタンス変数を直接使用しています。プロパティを使用しないと、指定されたオブジェクトの参照カウントが変更されないため、リークが発生します。

編集: 保持数をチェックするべきではありません。オブジェクトを使用する各場所のルールに従うだけで問題ありません。ルールは次のとおりです。

  • 作成したオブジェクトは、メモリを割り当てたり、コピーしたりすることallocで所有allocWithZone:できます。copycopyWithZone:mutableCopymutableCopyWithZone:

  • オブジェクトの作成者ではないが、使用できるようにオブジェクトをメモリに残しておきたい場合は、呼び出してオブジェクトの所有権を表すことができます。retain

  • releaseオブジェクトを作成したり、所有権を表明したりしてオブジェクトを所有している場合は、必要がなくなったときにオブジェクトを解放する責任があります。autorelease

  • 逆に、あなたがオブジェクトの作成者ではなく、所有権を表明していない場合は、それを解放してはなりません。

  • プログラムの他の場所からオブジェクトを受け取った場合、通常は、受け取ったメソッドまたは関数内で有効であることが保証されています。その範囲を超えて有効であり続けたい場合は、それを保持またはコピーする必要があります。既に割り当てが解除されているオブジェクトを解放しようとすると、プログラムがクラッシュします。

書く必要はありませんsetMyProperty。プロパティを@synthesize作成すると、そのメソッドが作成されます。

于 2011-11-11T09:17:12.457 に答える