iphone targetC alloc / release вопрос - PullRequest
4 голосов
/ 18 февраля 2010

Я новичок в языке ObjectiveC. У меня проблемы с пониманием синтаксиса управления памятью. Мой код ниже:

NSDate* someDate;
someDate=[[NSDate alloc] init];
loop
{ 
   someDate=[[NSDate alloc] init];
}

Будет ли здесь утечка памяти? или NSDate объект возвращается [autorelease]?

Спасибо

Ответы [ 4 ]

5 голосов
/ 18 февраля 2010

Как говорит @DavidKanarek, у вас будут утечки.

Существует несколько способов исправить эти утечки:

NSDate* someDate;
someDate=[NSDate date];
loop
{ 
   someDate=[NSDate date];
}

или

NSDate* someDate=nil;
someDate=[[NSDate alloc] init];
loop
{ 
   [someDate release];
   someDate=[[NSDate alloc] init];
}

[someDate release];

Первый из них проще для чтения кода, а второй снижает потребление памяти до минимума.Если ваш цикл не слишком большой, используйте первый.Если вы проходите цикл тысячи раз, я бы использовал второй.

Сэм

4 голосов
/ 18 февраля 2010

У вас будет много утечек памяти. Объекты изначально сохраняются (не автоматически высвобождаются), если они возвращаются методами, в имени которых есть new, alloc или copy. [NSDate date] будет автоматически выпущен. Если вы разместите более содержательный код, я могу помочь вам в достижении цели.

Также взгляните на Руководство по управлению памятью Apple .

1 голос
/ 24 мая 2016

Эта схема владения объектом реализуется через систему подсчета ссылок, которая внутренне отслеживает, сколько владельцев имеет каждый объект.Когда вы заявляете о праве собственности на объект, вы увеличиваете его счетчик ссылок, а когда заканчиваете работу с объектом, вы уменьшаете его счетчик ссылок.Хотя счетчик ссылок больше нуля, объект гарантированно существует, но как только счет достигает нуля, операционной системе разрешается его уничтожать.

http://rypress.com/tutorials/objective-c/memory-management

Но в последнем xcode он обеспечивает ARC (автоматический подсчет ссылок).
Так что он будет управлять счетчиком ссылок автоматически.весь объект это содержание внутри.

0 голосов
/ 14 октября 2016

У вас будет много утечек памяти.

someDate - это переменная poninter, которой назначается выделенный вами блок памяти, в данном случае [[NSDate alloc] init].

Однако в цикле вы присваиваете переменную-указатель другому болту памяти (someDate=[NSDate date])

Утечка памяти происходит, поскольку те блоки памяти, которые уже были выделены, не освобождены.

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