Могу ли я отправить релиз на ivar без alloc/init?

У меня есть NSString имущество:

.h файл

@property (nonatomic, retain) NSString *str;

.m файл

@synthesize str;

Что retain count из str без alloc/init? Могу я [str release] в методе?

5 ответов

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

Основные правила управления памятью

  • Вы владеете любым объектом, который создаете.
  • Вы можете вступить во владение объектом используя retain.
  • Когда он вам больше не нужен, вы должны отказаться от права собственности на принадлежащий вам объект.
  • Вы не должны отказываться от владения объектом, который вам не принадлежит.

Я отошлю вас к Политике управления памятью в Apple Docs для хорошего понимания управления памятью

Поэтому, прочитав документы Apple, вы полностью поймете, что происходит в вашем коде, но если вы этого не сделаете, то это не так. Вы не можете выпустить объект, владельцем которого вы не являетесь. Это нарушает пункт 4 Основных правил управления памятью в документах Apple. Чтобы стать владельцем этого объекта, вы должны сделать str = [[NSString alloc] init]; (Это не нужно с ARC) в вашем файле.m.

Хотя я бы порекомендовал прочитать об ARC намного лучше, чем самостоятельно управлять памятью. Поскольку вам больше не придется делать такие вещи, как [str release]; как только вы захотели отказаться от права собственности на объект, как это делается автоматически.

Вы не можете освободить объект, который еще не был выделен.

Используйте ARC, где это возможно, и читайте об изменениях в Objective-C за последние 2 года: больше нет необходимости синтезировать переменные, объявленные в.h, в вашем.m

Ты не должен release объект, который еще не был выделен. Но если вы делаете это, это означает, что вы отправляете сообщение nil объект. Это безопасно, потому что сообщение nil ничего не делает и возвращается nil, Nil, NULL, 0, или же 0.0,

Да, вы можете освободить этот объект. Всякий раз, когда вы отправляете alloc, copy, new, retain любое из этих сообщений для объекта. Количество сохраняемых предметов увеличилось на 1. И вы становитесь владельцем этого объекта. Таким образом, вы должны освободить объект, чтобы отказаться от владения.

И когда вы используете ARC, компилятор сделает это за вас. Надеюсь, поможет.

Как его retained собственность, которую вы можете сделать self.str=nil; вместо [str release] безопасно. Вы не можете сделать [str release] как мы можем release только то, что мы alloc а также init самим собой и не init еще.

Другие вопросы по тегам