0

デバイスでアプリをテストすると、カスタム オブジェクトのコピーを呼び出したときにリークが返され、その理由がわかりません。

これは呼び出しです:

NSMutableArray *arr = [[NSMutableArray alloc] initWithCapacity:5];
for (SinglePart *sp in [copyFrom partList]) {
    [arr addObject:[sp copy]];
}
self.partList = arr;
[arr release];

これは方法です:

- (id)copyWithZone:(NSZone *)zone {
    SinglePart *copy = [[[self class] allocWithZone:zone] initWithSinglePart:self];
    [copy loadImage];
    return copy;
}

これは、copyWithZone によって呼び出されるメソッドです。

- (id)initWithSinglePart:(SinglePart *)copyFrom {
    if (self = [super init]) {
        self.imagePath = [copyFrom.imagePath copy];
        self.color = [UIColor colorWithCGColor:copyFrom.color.CGColor];
        self.hasOwnColor = copyFrom.hasOwnColor;
        self.blendingMode = copyFrom.blendingMode;
    }
    return self;
 }
4

3 に答える 3

4

copy保持カウント1の新しいオブジェクトを返します。つまり、新しいオブジェクトを解放する必要がありますが、これは行っていません。

NSMutableArray *arr = [[NSMutableArray alloc] initWithCapacity:5];
for (SinglePart *sp in [copyFrom partList]) {
    SingPart *theCopy = [sp copy];
    [arr addObject:theCopy];
    [theCopy release];
}
self.partList = arr;
[arr release];

カスタムcopyWithZone:メソッドでさえ、オブジェクトを初期化しますが、自動解放しません。これは、copyメソッドの予想される動作です。copy は、retain や init と同様にバランスを取る必要があります。つまり、ある時点でリリースとバランスを取る必要があります。

最後に、initWithSinglePart:メソッドもリークしimagePathます。この場合、代わりにimagePathプロパティを宣言すると、これを手動で行う必要はまったくありません。次に、値を割り当てるだけで、プロパティ セッターに任せることができます。copyretain

// Header
@property (copy) NSString *imagePath;

// Now this will do the copy for you
self.imagePath = copyFrom.imagePath;
于 2010-10-12T16:37:57.853 に答える
1

また、プロパティはorセマンティクスimagePath で定義されていますか?retaincopy

その場合は、ここに自動リリースを追加する必要があります:

self.imagePath = [[copyFrom.imagePath copy] autorelease];

デフォルトのセッターもそれを保持/コピーするためです。

したがって、自動解放するか、「自己」を省略する必要があります。デフォルトのセッターをバイパスします。

于 2010-10-12T16:41:33.017 に答える
0

のコピーを作成しspてから、配列に追加しています。その後、配列はオブジェクトを保持するため、保持カウントは 2 になります。

最後に を解放arrすると、アイテムの保持カウントが 1 になります。

spオブジェクトに別のリリースを追加するか、使用しないでcopyください。

これを試して:

self.partList = [NSMutableArray arrayWithCapacity:5];
for (SinglePart *sp in [copyFrom partList]) {
    [arr addObject:sp];
}
于 2010-10-12T16:38:56.760 に答える