автоматическое освобождение NSString в методе класса, вызывающее сбой приложения в iOS - PullRequest
1 голос
/ 28 июля 2011

Я получаю следующую ошибку:

int main(int argc, char *argv[])
{
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
    int retVal = UIApplicationMain(argc, argv, nil, nil); //breakpoint that says Thread 1: Program Received Signal: "EXC_BAD_ACCESS".
    [pool release];
    return retVal;
}

Мои два вопроса можно найти внизу этого сообщения:)

В настоящее время я работаю над заданием для iOSкласс программирования и ударил дорожный удар.

Я нашел исправление, показанное ниже, но оно не имеет смысла для меня.Проверьте это:

@implementation MyClass

// This class method takes an (NSMutableArray *) and returns an NSString with its contents printed out.
+ (NSString *)myString:(NSMutableArray)anArray
{
    // NSString *myString = [[NSString alloc] init]; OLD CODE THAT CAUSES MEMORY LEAK
NSString *myString = [[[NSString alloc] init] autorelease]; //NEW CODE THAT RELEASES FIRST ALLOCATION OF myString WHEN THE FIRST stringByAppendingFormat: IS CALLED
    NSString *vp = VARIABLE_PREFIX; //#defined above to be @"%

    for (id object in anArray) {
        if ([object isKindOfClass:[NSString class]]) {
            if ([object hasPrefix:vp]) {
                myString = [myString stringByAppendingFormat:@"%@",[object substringFromIndex:1]];
            }else{
                myString = [myString stringByAppendingFormat:@"%@",object];
            }
        }else if ([object isKindOfClass:[NSNumber class]]) {
            myString = [myString stringByAppendingFormat:@"%@",object];
        }
    }

    return myString; //shouldn't I autorelease myString right before this line? NO NOT ANY MORE. THIS myString IS NOT THE ORIGINAL THAT I alloc-init, BUT AN AUTORELEASED OBJECT RETURNED BY THE stringByAppendingFormat: message.
    }

Когда я пытаюсь отправить сообщение [myString autorelease];, программа вылетает с вышеуказанной ошибкой.Теперь он работает нормально, как показано выше, но я не понимаю, почему.

Каждый раз, когда я отправляю сообщение, содержащее «волшебные слова» alloc, init, copy Мне нужно позвонить release, это не так?Или правила метода различаются (может ли сам класс иметь файл?).Я не вызываю retain в объекте, который вызывает этот файл.

Вот мои два вопроса:

  1. Почему происходит сбой при попытке освободить theDescription используя autorelease?

  2. Мой код создает утечку памяти?

Это мой самый первый вопрос о переполнении стека!Спасибо за вашу помощь!

Ответы [ 2 ]

2 голосов
/ 28 июля 2011

Почему происходит сбой, когда я пытаюсь выпустить описание с помощью автоматического выпуска?

Предполагая, что вы имеете в виду myString, происходит сбой, поскольку myString уже выпущен автоматически. Вы получили его, вызвав -stringByAppendingFormat:, который возвращает автоматически освобожденную строку. Теперь вы, вероятно, думаете: «Но я создал его, вызвав + alloc, поэтому я должен выпустить его». Это правда, но строки NSSt неизменны, и когда вы вызываете -stringByAppendingFormat:, вы получаете другую строку, и эта строка автоматически высвобождается. Авторизование во второй раз является ошибкой.

Мой код создает утечку памяти?

Да, но не совсем. «Утечка» - это пустая строка, которую вы выделяете в начале. Вы никогда не выпускаете эту строку, поэтому у вас есть утечка. Тем не менее, NSString, очевидно, оптимизирован таким образом, что [[NSString alloc] init] возвращает синглтон, поэтому в данном конкретном случае не имеет значения, что пустая строка не освобождается. Все остальные строки, которые назначены на myString, автоматически освобождены, поэтому ни один из этих объектов не пропущен.

0 голосов
/ 28 июля 2011

Почему происходит сбой, когда я пытаюсь выпустить описание с помощью

Проблема с обновленным кодом заключается в том, что ypu переназначает указатель на myString с использованием метида, который уже возвращает объект autoreleases: stringbyappending, поэтому, если вы вызовете autorelease для этого объекта, который уже получит autoreleased, я потерплю крах.

Кроме того, первое предположение в alloc init вызывает утечку памяти при переназначении ypu с помощью stringbyappendingstring, так как вы теряете ссылку на ранее созданную строку с помощью alloc init и, следовательно, вы никогда не сможете ее освободить.

Извините за форматирование на моем iPhone атм =)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...