2010-03-16 4 views
0

У меня вопрос в управлении памятью (цель C). Существует два идеальных сценария.Управление памятью в ObjC/iPhone

================================== 1 сценарий 1 =============== =========================

(void) funcA 
{ 
    MyObj *c = [otherObj getMyObject]; 
    [c release]; 
} 

-(MyObj *) getMyObject //(this method is available in other OtherObj.m file) 
{ 
    MyObj *temp = [[MyObj alloc] init]; 
    // do smothing here 
    return temp; 
} 

================== =========== сценарий 2 ============================================================================= ===

(void) funcA 
{ 
    MyObj *c = [otherObj getMyObject]; 
} 

-(MyObj *) getMyObject //(this method is available in other OtherObj.m file) 
{ 
    MyObj *temp = [[myObj alloc] init]; 
    // do smothing here 
    return [temp autorelease]; 
} 

myObj держит огромный кусок данных.

В первом сценарии я получаю myObj (выделено) из другого файла, поэтому мне нужно выпустить его в моем собственном методе. (как в любой языковой библиотеке C/C++, например, strdup вернет дубликат строк, который позже будет реализован разработчиком не методом strdup).

Во втором сценарии я получаю myObj (выделено) из файла otherObj.m, так что файл otherObj.m ответственен за освобождение выделенной памяти (средняя автореферат)? Это правильно?

Пожалуйста, дайте мне знать. Какой сценарий более эффективен и действителен в соответствии с правилами памяти Apple. Пожалуйста, не показывайте мне ссылку на документ.

Благодаря Manu

+0

Возможно, вы захотите щелкнуть маленькую иконку на панели инструментов со всеми двоичными числами, она форматирует материал как код :). –

ответ

1

Могу ли я предложить the documentation на управление памятью для iPhone?

+0

Здесь метод getter дает вам один выделенный объект. То же, что и метод alloc ... но почему мы должны отправить его в пул автозапуска. Мы можем отменить это после вызова метода gettter. Я ответственный человек, чтобы получить объект, поэтому я являюсь владельцем этого метода ... почему яблоко не разрешено выпустить после метода getter .. он предполагает, что мы сохраняем его в пуле autorelease, потому что метод gettter является владельцем этого объекта. Это означает, что пул авторефератов будет увеличиваться. Это создаст проблему, если я назову этот метод несколько раз? – Manoj

2

Второй подход предпочтительнее. Соглашение заключается в том, что только методы «alloc» и «copy» должны возвращать объект, который является обязанностью вызывающего абонента для выпуска. Это соглашение предназначено для удобства обслуживания и не имеет ничего общего с эффективностью.

Эффективность (типа памяти) действительно действительно вступает в игру, если вы планируете звонить getMyObject в цикл с большим количеством итераций. В этом случае автореализованные объекты MyObj будут накапливаться в памяти, потому что они не освобождаются до конца итерации цикла выполнения. Если это проблема, переместите alloc/init вне вызова метода, чтобы вы могли освободить объект самостоятельно в конце каждой итерации вашего цикла.

+0

Если каждый объект, возвращаемый методом getter, будет отправлен в автозапуск пула .. чем пул autoreleas будет увеличиваться и может быть, что может создать нехватку памяти? Является ли это возможным? – Manoj

+0

Кроме того, имена, начинающиеся с 'get', подразумевают, что вы собираетесь хранить их в некоторой переменной, например' [obj getName: & someDestination] '. –

+0

@Manu: Правильно. Вот почему вы, возможно, захотите переместить '[[MyObj alloc] init]' из 'getMyObject' и в' funcA'. Затем вы можете освободить объект в 'funcA', как в« сценарии 1 ». – Tom

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