Вы никогда не должны заботиться об абсолютном количестве сохранений. Только то, что вы «сбалансированы», это означает, что для каждого alloc
, new*
, copy
, mutableCopy
и retain
вам нужен соответствующий release
или autorelease
(то есть, когда не используется ARC).
Если вы примените это правило к каждой строке, вы увидите, что во второй строке есть alloc
, но релиза нет. На самом деле, размещать экземпляр здесь абсолютно бесполезно, так как он вам все равно не интересен. Поэтому следует просто читать:
NSMutableArray *firstArray = [[NSMutableArray alloc] initWithObjects: obj1,obj2,nil];
NSMutableArray *secondArray = [firstArray mutableCopy];
// There is no third line.
Но давайте обсудим ваш исходный код и посмотрим, что произошло:
NSMutableArray *firstArray = [[NSMutableArray alloc] initWithObjects: obj1,obj2,nil];
NSMutableArray *secondArray = [[NSMutableArray alloc] init];
// secondArray points to a new instance of type NSMutableArray
secondArray = [firstArray mutableCopy];
// You have copied another array (created a new NSMutableArray
// instance) and have overwritten the pointer to the old array.
// This means that the instance allocated in line 2 is still there
// (was not released) but you don't have a pointer to it any more.
// The array from line 2 has been leaked.
В Objective-C мы часто говорим о владении: очень мало методов, которые делают вас «владельцем» объекта. Это:
alloc
new*
, as in newFoo
copy
и mutableCopy
retain
Если вы вызываете их, вы получаете объект, за который вы отвечаете. А это значит, что вам нужно вызвать соответствующее число release
и/или autorelease
на эти объекты. Например, у вас все в порядке, если вы сделаете [[obj retain] retain];
, а затем [[obj autorelease] release];
person
DarkDust
schedule
08.11.2011