#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 и соответствующим образом изменил код! Теперь все работает нормально, и теперь утечек памяти нет!