Переменная NSString: должна ли она быть освобождена? - PullRequest
0 голосов
/ 16 декабря 2010

Когда мы создаем объект NSString, нужно ли его освобождать?

Когда я запускаю статический анализатор для своего приложения, я получаю следующее

NSString *dataStr=[[NSString alloc] initWithData:receivedData encoding:NSASCIIStringEncoding];    
Method returns an Objective-C object with a +1 retain count (owning reference)

Ответы [ 4 ]

3 голосов
/ 16 декабря 2010

Причина, по которой статический анализатор говорит об этом, заключается в том, что имя вашего метода не означает, что вызывающий метод имеет право собственности на возвращаемый вами объект.Есть несколько решений:

  1. Измените имя вашего метода так, чтобы оно подразумевало владение возвращаемым объектом, т.е. эти имена подразумевают владение, потому что они начинаются со слова «новый» или содержат слово«Копия»:

    • - (NSString *) newDataString
    • - (NSString *) copyDataString

    Если вы используете имена методов, как указано выше, это означает, что вызывающая сторонаМетод отвечает за отправку объекту сообщения release, когда оно сделано с ним.

  2. Измените ваш метод так, чтобы он отказывался от владения объектом перед возвратом, используя autoreleaseМетод:

    - (NSString *) dataString
    {
        NSString *tmp = [[NSString alloc] initWithFormat:@"%f", 2.444];
        return [tmp autorelease];
    }
    

    Помните, что каждый alloc, copy или retain должен быть сбалансирован с release или autorelease (но не обоими!).

  3. Прочитайте Правила управления памятью какао .Эти правила не являются обязательными, вы должны следовать им.Правила тоже очень простые.После небольшой практики они станут второй натурой.

3 голосов
/ 16 декабря 2010

Волшебные слова: alloc, copy и retain: если какое-либо из них используется при создании объекта или объявлении свойства, вам потребуется release его.

1 голос
/ 16 декабря 2010

Да, вам нужно выпустить его. Каждая переменная, у которой есть счетчик, должна быть освобождена.

1 голос
/ 16 декабря 2010

Да, вам нужно выпустить его.Как правило, каждый раз, когда вы создаете указатель объекта, вызывающий alloc, вам нужно будет вызвать release.

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