2012-05-08 2 views
0

Если у меня есть ClassA.hосвободить объект, управление памятью, Objective C

1. @ собственности (неатомической, сохраняют) NSMutableArray * обр;

ClassA.m

- (ClassA) функция {

1.ClassA *obj = [[ClassA alloc] init]; 
    // initialize the arr 
    // add another object into the arr 
    2. [obj.arr addObject:nameOfAnObject] 
    3. return obj; 

}

в ClassB, я хочу, чтобы вызвать функцию (CLASSA) метод. Что я делаю:

ClassB.m

- (недействительными) {viewDidload

1.[super viewDidLoad]; 
    2.ClassA  *classAinB = [[classA alloc] init];                   
    3.classAinB = [classA function]; 
    4.[classAinB release]; 

}

Согласно правилу управления памятью, потому что у меня есть ClassAinB в ClassB.m, поэтому я освобождаю его в конце.

Мой вопрос заключается в том, как это вар ClassA, которые у меня есть в ClassA.m, когда я должен освободить его, так что после обратного вызова в строке 3 ClassB, я до сих пор объект ClassA которого обр является содержащий имяOfAnObject объект

Прошу вас, посоветуйте мне по этому вопросу. Любые комментарии приветствуются здесь. Спасибо

ответ

2

Добавьте его в автореферат. т.е. return [obj autorelease];. Это позволит убедиться, что объект отправлен сообщение release в конце итерации цикла запуска, если у него больше нет владельца.

+0

как id примерно: ClassA * obj = [[[ClassA alloc] init] autorelease] ;. Это значение как возвращение [[obj autorelease]]; – tranvutuan

+0

вы тоже можете это сделать. Он делает то же самое, поскольку все это делается в рамках той же самой итерации цикла выполнения. – mprivat

1

В любое время, когда у вас есть alloc, для этого вам необходимо соответствующее release.

В XCode 4.2 + с LLMV компилятором (и включен ARC) вам не придется беспокоиться о подсчете ссылок, поэтому, когда вы alloc объект, вам не нужно беспокоиться о вызове release, на самом деле вы можете 't, поскольку компилятор вызовет ошибку.

+0

's/iOS 5+/ARC' – deanWombourne

+0

Я думаю, вы имеете в виду, если у вас включен ARC, а не ios5 + – Martin

+0

Я изменил свой ответ, чтобы быть более правильным. –

1

Если вы используете ручной удержание: Вы назначаете 2 объекта класса A. Один - когда вы прямо выделяете его из функции класса B, другой - когда вы вызываете функцию класса A внутри этой функции. Итак, когда выполняется строка 3, вы уничтожаете ссылку (переписываете classAinB var) на объект classA, а это утечка памяти. Если вы хотите использовать заводский метод, который возвращает вам объект класса A, сделайте этот метод статическим.

Смежные вопросы