Освобождение экземпляров NSNumber, созданных с помощью initWithInteger: vs. numberWithInt: - PullRequest
1 голос
/ 23 июня 2011

На странице 326 в книге Программирование в Objective-C 2.0 Автор говорит:

myNumber = [[NSNumber alloc] initWithInt: 1000];  

Конечно, основываясь на предыдущих обсуждениях, если вы создадите myNumber таким образом, вы будете ответственны за последующее его опубликование, когда вы закончили использовать его с таким утверждением, как:

[myNumber release];  

Мой вопрос:

Означает ли это, что если я создаю NSNumber объект с этим оператором

NSNumber *myNumber = [NSNumber numberWithInteger: 100];  

Мне не нужно освобождать объект myNumber сам?

Ответы [ 3 ]

6 голосов
/ 23 июня 2011

Эта ссылка - ваша Библия

В случае [NSNumber numberWithInt:] она возвращает объект с автоматическим освобождением, и вам не нужно ничего делать, чтобы освободить его должным образом.Если, конечно, если вы не retain это, в этом случае вы бы вызвали release, вероятно, из вашего dealloc метода.

[[NSNumber alloc] initWithInt:] возвращает объект с сохраненным счетчиком одинзвонит alloc).Вы несете ответственность за освобождение любого объекта, созданного таким образом.

1 голос
/ 23 июня 2011

Если вы звоните alloc, retain, new, copy (или mutableCopy), вы несете ответственность за освобождение объекта.

Во всех остальных случаях объект автоматически освобождаетсяи НЕ ДОЛЖЕН вызывать release.

Нет правил компиляции или времени выполнения, которые бы обеспечивали это *, это просто соглашение об именах языков, но оно используется везде, поэтому вы можете рассчитывать на его истинность.

Ваш собственный код также должен следовать этому соглашению.

* Автоматический подсчет ссылок полагается на соглашение о присвоении имен для правильной работы.Подробнее см. http://clang.llvm.org/docs/AutomaticReferenceCounting.html#objects.operands.retained_returns.

1 голос
/ 23 июня 2011

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

  • Когда вы создаете объект с помощью alloc, вы обязаны освободить / автоматически освободить его.
  • Когда вы сохраняете объект, вы обязаны освободить / автоматически освободить его.
  • Другие, это не ваша ответственность, если вы отпускаете / автоматически выпускаете объект, который вам не принадлежит, вылетает.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...