Использование NSString в качестве переменных вызывает утечки памяти в ios, пожалуйста, предложите лучший тип данных для использования в качестве переменной вместо этого

#ios

#iOS

Вопрос:

Я создаю приложение-калькулятор, и это мое первое приложение для ios, поэтому я не очень заботился об управлении памятью, но теперь, когда я оглядываюсь назад, я вижу некоторые утечки. Я точно знаю, где находятся утечки (используемые утечки — XCODE), поскольку все утечки вызваны NSStrings, которые не могут быть изменены. Следовательно, я выделял строки даже для изменения текста метки:

 label.text = [[NSString alloc] initWithFormat: @"%@", number];
  

где number — это другая строка (которую мне приходится много изменять и снова вызывать утечки)
Следовательно, каждый раз, когда я изменяю метку, у меня возникает утечка.

Может кто-нибудь подсказать, какой тип данных использовать, чтобы я мог просто использовать одну копию объекта и продолжать изменять его по мере необходимости. ИЛИ другой способ изменить метку, номер либо без использования alloc, либо освободить его вовремя.

Я пробовал его автоматическое освобождение, но это приводит к сбою приложения. К вашему сведению, наряду с утечками, приложение отлично работает 🙂 (но я знаю, что это неправильно, следовательно)

Пожалуйста, помогите! Спасибо

Ответ №1:

Предполагая, что ваша метка UILabel , тогда ваша проблема очевидна, свойство text UILabel определяется как retain , когда вы выполняете alloc, он возвращает объект с retain 1, когда вы присваиваете свойству, которое устанавливает, увеличивает количество сохранений на единицу, поэтому у вас есть 2 количество сохранений, икогда вы избавляетесь от своего ярлыка, который вы пропускаете, это должно выглядеть так

 label.text = [[[NSString alloc] initWithFormat: @"%@", number] autorelease]; 
  

или

 label.text = [NSString stringWithFormat: @"%@", number];
  

Вам следует ознакомиться с рекомендациями по управлению памятью здесь

-Даниэль

Комментарии:

1. Я попробовал оба предложенных вами ответа, но это только приводит к сбою приложения. Есть ли какой-либо другой тип данных, такой как строка, который я могу использовать для изменения / редактирования переменных?

2. у вас что-то еще не так в вашем коде… покажите еще немного … где происходит сбой

3. Спасибо, Даниэль, я изменил все NSStrings на NSMutableStrings и соответствующим образом изменил код! Теперь все работает нормально, и теперь утечек памяти нет!

4. Я все еще не уверен, почему [NSString stringWithFormat: @»%@», number]; не работал, но я просто создал один экземпляр NSMutableString для каждой из переменных, а затем продолжал изменять этот один экземпляр до конца, и все прошло нормально, поскольку у меня был только один экземпляр NSMutableString.каждая переменная для освобождения.

5. Я точно знал, что я выделял NSStrings каждый раз для каждой переменной, поскольку теперь есть способ изменить NSString . Следовательно, все утечки были связаны с NSStrings. Затем я понял, что NSMutable string позволяет изменять один экземпляр, и это именно то, что я хотел!

Ответ №2:

попробуйте использовать

 label.text = [NSString stringWithFormat: @"%@", number];
  

Для назначения текста метке вместо этого используйте автоматически выпущенную строку.

Кстати… что такое число? это строка или целое число?

Позже вы, возможно, захотите ознакомиться с некоторой документацией, касающейся управления памятью в iOS.

Комментарии:

1. number — это объект nsstring . У меня также возникают проблемы с утечкой number аналогичным образом. Я попробовал ваш метод и предложенный выше, и использование любого из них приводит к сбою моего приложения.

2. если это приводит к сбою вашего приложения, то у вас большая проблема только с управлением памятью. Возможно, вы захотите опубликовать еще один вопрос с некоторым фактическим кодом (т. Е. Кодом, Который создает число, а затем присваивает его метке).

3. Спасибо, Майкл, я изменил все NSStrings на NSMutableStrings и соответствующим образом изменил код! Теперь все работает нормально, и теперь утечек памяти нет!

Ответ №3:

Используйте это вместо:

 label.text = [NSString stringWithFormat: @"%@", number];
  

stringWithFormat создает автоматически выпущенную NSString, которая будет выпущена для вас, когда пул автоматического выпуска будет исчерпан.

Комментарии:

1. Тогда здесь происходит что-то еще. Вы уверены, что ‘number’ — это NSString ? Возможно, вам следует опубликовать еще немного кода и сообщить нам, каков результат сбоя.

2. Эй, я написал весь код в appdelegate и удалил viewcontroller и файл .xib. Я использую файл mainwindow.xib. Я не помню, почему я сделал эту странную вещь, но может ли это быть проблемой? Также нормально, если я опубликую весь свой код здесь?

3. Что ж, начните с публикации описания сбоя, которое вы видите в окне вывода в Xcode, и мы возьмем его оттуда.

4. Спасибо, Робин, я изменил все NSStrings на NSMutableStrings и соответствующим образом изменил код! Теперь все работает нормально, и теперь утечек памяти нет!