Цель C: выпустить и распределить - PullRequest
1 голос
/ 12 июля 2011

Я довольно новичок в C и Objective C, однако не могу найти этот ответ

Так что я столкнулся с проблемой, которая заняла у меня некоторое время, чтобы разобраться, в основном мне сказали, что когда бы вы ни выделяли объект, вы должны его освобождать. Так вот что я сделал, и это привело к сбою моей программы ...

Вот код:

NSString *numberString = [[NSString alloc] init];
numberString = resultLabel.text;
[self setFirstNumber:[numberString doubleValue]];
[resultLabel setText:@"0"];
[numberString release];

Мне кажется, я понял, почему это происходит из-за строки "numberString = resultLabel.text", однако я не понимаю, почему программа падает. Почему я не могу выпустить numberString? Приведет ли это к утечке памяти, если я этого не сделаю?

P.S. Я знаю, что код неуклюжий, я новичок в программировании и еще более супер новичок в Objective C.

P.S.S. Позже я освобождаю resultLabel в - (void) dealloc {}

Ответы [ 3 ]

5 голосов
/ 12 июля 2011

numberString - указатель, который означает, что он будет указывать на память, которую вы назначаете.В первой строке да, вы вызывали alloc / init, и вы несете ответственность за его освобождение.На следующей строке вы устанавливаете указатель на другое значение, которым вы не владеете, и исходная строка, на которую вы вызвали alloc, становится утечкой.Вызов [[NSString alloc] init] совершенно бессмыслен, но вот ваш пример работы с выпуском.

NSString *numberString = [[NSString alloc] init]; //Not necessary
[numberString release]; //Properly released now it is safe to reassign
numberString = resultLabel.text; 
//numberString is now pointing at another object

[self setFirstNumber:[numberString doubleValue]];
[resultLabel setText:@"0"];
//No need to release it any more here

Что вам нужно сделать, это просто установить numberString в текст и не использовать вызовы релиза.

NSString *numberString = resultLabel.text;
2 голосов
/ 12 июля 2011

Измените первые две строки на:

NSString *numberString = [[NSString alloc] initWithString: resultLabel.text];

Поскольку экземпляр NSString является неизменяемым, вы не можете установить его значение после его инициализации.То, что вы делаете в своем коде - это установка указателей.

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

Ты прав! Письмо:

numberString = resultLabel.text;

Теперь вы ссылаетесь на экземпляр String файла resultLabel.text, и когда вы пытаетесь его освободить, это ошибка, потому что эта строка не была выделена вами, поэтому вы не должны ее освобождать.

Если вы просто ссылаетесь на текст из Object за resultLabel, просто пропустите первую строку, потому что вам просто нужна переменная типа NSString (указатель) и вам не нужен новый экземпляр NSString.

[EDIT] Как правильно упомянул dasdom, выделив и поместив объект NSString в первой строке, который вы никогда не используете и который никогда не выпускаете (вы пытаетесь освободить NSString из метки, которая выпускается где-то еще), вы создана утечка памяти.

...