Могу ли я отправить релиз на 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
еще.