2010-09-03 3 views
0

Мне удалось смутить некоторые элементы управления памятью. Я новичок в объектно-ориентированных и управляемых памятью языках.Управление памятью iOS: ivars, static и NSStrings

Я прочитал руководство по управлению памятью, но я по-прежнему путаюсь в нескольких вещах. 1) Есть ли необходимость в очистке иваров и переменных метода, которые не сохраняются ни одним объектом. Например,

-(void) someMethod{ 
int count = 100; 
for (int i=0; i <count; i++) { 
    NSLog(@"Count = %d", i); 
} 
    }  

Что происходит с «count» var после завершения метода? Если метод выделяет много временных переменных, удаляются ли они из памяти до тех пор, пока они не будут освобождены, объекты alloc'd? Или мне нужно каким-то образом установить их в нуль?

2) Если у меня есть статическая переменная, например, NSString, мне нужно что-либо сделать для ее удаления из памяти, когда класс отменен?

3) Я заметил, что у NSStrings, похоже, есть saveCount 2147483647, который, по словам Википедии, является максимальным значением для 32-разрядного целого числа со знаком.

http://en.wikipedia.org/wiki/2147483647

myString retainCount = 2147483647 

-(void) someMethod{ 
NSString *myString = @"testString"; 
NSLog(@"myString retainCount = %d", [myString retainCount]); 
// logs: myString retainCount = 2147483647 
} 

Что происходит с этим в конце метода? Неужели эта память когда-либо опустела? Строка не ссылается ни на что. Я понимаю, что метод @ "" для NSString возвращает объект с автореализацией, но в любом случае смысл автореализации чего-либо с saveCount 2147483647? В этом случае, какой смысл сохранять или выпускать ANY NSString?

Мне хорошо известно, что keepCount следует игнорировать, но это просто заставляет меня не знать, что здесь происходит.

4) Это вообще? Я знаю, что памяти, связанной с NSString, не так много, чтобы писать домой, но я хочу быть хорошим гражданином в области управления памятью, и меня больше интересуют лучшие практики, чем что-либо еще.

+3

Фактически 2147483647 - это наибольшее значение * подписанного * 32-битного целого числа. Он используется рамкой Cocoa для обозначения постоянного объекта, который не может быть выпущен. Обычные NSStrings, которые вы создаете, имеют более традиционное количество учетных записей. – JeremyP

+0

Спасибо за разъяснение. Вопрос отредактирован соответствующим образом. – averydev

ответ

5

Сохранение/освобождение относится только к объектам, а не к int, bool, float, double или другим встроенным устройствам. Поэтому используйте его для id или других классов, в которых у вас есть указатель на объект. В вашем примере счет не нужно сохранять или отпускать. Он выделяется в стек, который автоматически очищается, когда функция возвращается.

Вам необходимо иметь дело с любыми локальными объектами, которые вы alloc. Они создаются с фиксированным числом, установленным в 1, поэтому вам нужно либо удерживать их на потом, либо освобождать их. Большинство функций какао (которые не начинаются с копирования или выделения) возвращают объект, который автореализован. Это означает, что у них будет доступ к релизу позже - вы можете удерживать их только после функции, если вы вызываете удержание на них. Если вы хотите, чтобы их очищали, вам не нужно ничего делать (вызов выпуска приведет к слишком большому количеству вызовов).

Если у вас есть статическая переменная, указывающая на объект, то она не затрагивается, когда объекты этого класса освобождаются. Если вы хотите, чтобы он был выпущен, вам нужно позвонить на него. Если static является int, bool или другим встроенным, вы не можете (не можете) вызывать его. Это часть глобальной памяти вашего приложения.

NSStrings, которые настроены на строковые литералы, не должны иметь доступ к выпуску. Для них значение keepCount не имеет смысла. Это значение равно -1 для подписанных значений int.

Если вы это сделаете - [[NSString alloc] initCallHere:etc] - вам нужно позвонить на него. В большинстве случаев вы получаете строки, вы не используете alloc, поэтому вам не нужно вызывать выпуск. Если вы сохраните один, вам нужно вызвать выпуск.

Да, это имеет значение. Со временем утечки заставят iPhone убить ваше приложение.

+0

Спасибо за ваш ответ, так что строки, созданные с использованием синтаксиса @ "", остаются в памяти до тех пор, пока приложение не будет убито? Или они помещаются в пул для очистки, если не будут сохранены дальше? – averydev

+1

Строки '@" "' являются фактически статическими, то есть частью образа памяти вашего приложения. Вам не нужно их чистить (хотя на самом деле это не имеет значения, если вы это делаете, поскольку для практических целей это бесконечное количество удержаний). Однако, если вы 'alloc',' copy' или 'new' объект, используя такую ​​строку, вы должны определенно« освободить »этот объект. – walkytalky

+0

Может ли количество строк @ "" в вашем приложении, например, множество операторов журналов или другое использование @ "" для краткосрочных целей, влиять на производительность приложения или значительно увеличивать его объем памяти в целом и отрицательно? Должны ли использоваться короткие переменные строки, созданные с использованием @ "", в нуле, когда их полезность истекла? – averydev

2
  1. Вам не нужно беспокоиться о count потому что это целое число, примитивный тип данных, а не объект.

  2. Я читал, что они просто уходят после завершения приложения или если вы явно освобождаете их.

  3. Вы правы в том, что вы должны не беспокоиться об удержании счета таким образом. Какао автоматически дает @"" (NSConstantString объектов) абсолютное максимальное значение сохранения, чтобы они не могли быть выделены.

  4. Вы по-прежнему усложняете тему. Точка в руководстве заключается в том, что вы знаете, что вам нужно только беспокоиться об управлении памятью в трех конкретных ситуациях. Apple дает вам эти рекомендации, так что вам не нужно беспокоиться о конкретных внутренних компонентах для каждого отдельного класса (например, отслеживание вручную retainCount), не говоря уже о том, что иногда Cocoa делает все по-другому (как с NSConstantString). До тех пор, пока вы помните эти рекомендации, вам действительно не нужно знать очень подробные сведения о том, что происходит под ним (конечно, понимание концепции учета удержания помогает, но сравнивайте это с ручным отслеживанием).

Я не знаю, какие руководства вы читаете конкретно, но если вы не дали this one попробовать, я очень рекомендую его. Он кратко и кратко излагает три руководящих принципа.

2

Правила управления памятью какао только охватывают объекты Objective C.

Локальные переменные (нестатические) очищаются при выходе любой подпрограммы или метода (фактически, стекная память просто повторно используется/перезаписывается последующими подпрограммами или методами в том же потоке). Константы, которые требуют памяти (строки) и статических переменных, очищаются, когда приложение вырывается ОС после его выхода. Ручная память malloc'd очищается, когда вы вручную ее освобождаете.

Но любой объект, который вы выделяете или сохраняете: (независимо от того, назначен ли он для ivar, local, global, static и т. Д.), Должен управляться как любой другой объект. Будьте осторожны, назначая объекты глобальным переменным, если вы действительно не умеете удерживать управление счетами.

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