2010-10-19 4 views
2

1) В чем причина использования сохранения?Цель C, управление памятью

Например, в методе установки:

- (void) setCount: (int) input { 
    [intCount autorelease]; 
    intCount = [input retain]; 
} 

2) autorelease-метод: Является ли это удаление старого объекта или подготовки нового?

3) Почему метод-удержание вызывается у входного объекта?

бы

intCount = input; 

быть не так? И почему?

+1

Обратите внимание, что ваш (int) не может быть автореализован или сохранен (так как это не объект) – KevinDTimm

ответ

4
  1. Retain предназначен для увеличения стоимости retainCount предмета. NSObjects имеют свойство retainCount, которое поддерживает подсчет количества ссылок, которые в настоящее время хранятся на объекте. Когда retainCount объекта достигает 0, объект может быть освобожден из памяти. Эффективно это предотвращает освобождение объекта из памяти, если он все еще используется в другом месте.

  2. Метод autorelease делает не удалить старый объект и делает не подготовить новый объект.Это эффективно упреждающий вызов, чтобы освободить объект (autorelease является гораздо более сложным, чем это, и вы должны прочитать об этом в Memory Management Guide.)

  3. В вашем случае intCount = input не было бы неправильно, потому что вы работаете с приматом. Однако, если вход был объектом, тогда вам нужно будет удерживать его. На самом деле вам даже не нужно писать собственные геттеры/сеттеры для примитивов (или объектов), но вместо этого следует использовать Declared Properties. На самом деле вам почти всегда выгоднее использовать объявленные свойства, и если вы действительно хотите сворачивать самостоятельно, сначала ознакомьтесь с pitfalls of doing so.

+1

@Jacob Спасибо, что нашли ошибку синтаксиса! –

+1

Спасибо, Jacob & Gavin, –

+0

Упс, не был готов. ОК, я думаю, я понял. Раньше я программировал на C#, до сих пор я боялся указателей. Спасибо за помощь! Теперь я понял, почему «сохранить» необходимо для объектов, на которые ссылаются указатели. Но еще многое предстоит узнать. Я также изучаю C-программирование, потому что у меня нет mac дома. Mac, который я кодирую (iPhoneApps), находится в небольшом агентстве интернет-услуг. Любые советы по изучению чего-то подобного на окнах (MVC && (C || C++)), поэтому я также могу изучить эти понятия? TNX для PITFALLS, мне они понадобятся –

0

Чтобы ответить на вопрос ур конкретно:

1). использование сохранения заключается в объявлении права собственности на объект. В этом случае, intCount сохраняет право собственности на вход, в случае вход был выпущен где-то еще, у еще можно использовать intCount.

2). автореферат intCount должен отказаться от права собственности на прежнее значение. Это позволит избежать утечки памяти старого значения. Если u не освобождает старое значение и присваивает этому значению новое значение, старый объект всегда будет там и никогда не будет выпущен, что приведет к утечке памяти.

3). если u не сохранит вход , а параметр ввода получил в другом месте. то, если нигде не сохранится этот объект, он будет освобожден. Таким образом, вы не можете использовать intCount. Вот почему вам нужно сохранить его или скопировать.

Но я думаю, что если вы делаете intCount = input;, все должно быть хорошо. Поскольку int не является объектом, это всего лишь тип. Так что я думаю, что весь метод хорошо быть написано так:

- (void) setCount: (int) input { 
    intCount = input; 
} 

Но если его указатель, у не должен присвоить новое значение старого непосредственно.

+0

OK! Спасибо! Мне следовало бы задать вопрос «сохранить» с ссылочным объектом. Правильно? –

+0

_testitalic_ ** testbold ** '[test setText: @ "test"]' –

1

Ответы на ваши вопросы были удовлетворены достаточно хорошо, поэтому позвольте мне добавить, что если вы можете использовать сборку мусора, вы должны. Это делает все намного проще. Это не панацея, и вы все равно должны научиться использовать механизм сохранения/освобождения, но если вы не имеете дело с некоторыми вызовами большой громкости, создавая и удаляя множество объектов, тогда просто используйте сборку мусора.

Его можно найти в разделе Проект | Изменить настройки проекта | Build

Затем просто найдите «мусор», и вы увидите его.

Если вы занимаетесь разработкой iOS и не можете использовать сборку мусора, я приношу свои извинения за предоставленную бесполезную информацию, но это все еще означает разработку, отличную от iOS.

+0

Я кодирую iOS, но я думаю, что лучше научиться управлять памятью вручную! TNX –

+0

Абсолютно. Вы должны научиться делать все, что может быть автоматизировано для вас, например, для аксессуаров и управления памятью, но как только вы их поймете, если нет успеха в производительности, вы должны использовать автоматические методы. Это подход Agile, кодекс умный, а не жесткий. В iOS планируется добавить сборку мусора, но это не помогает старым устройствам, в которых пользователи отказываются обновляться из-за снижения производительности. Извините, я не был более полезным. – 2010-10-23 22:59:42