alloc / release объектов Objective-C - PullRequest
       20

alloc / release объектов Objective-C

0 голосов
/ 28 февраля 2011

У меня есть класс Util следующим образом.

@implementation Util

- (NSString*) getTodayString
{

    NSDate *today = [NSDate date];
    NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
        // display in 12HR/24HR (i.e. 11:25PM or 23:25) format according to User Settings
    [dateFormatter setDateFormat:@"YYYY/MM/dd"];
    NSString *now = [dateFormatter stringFromDate:today];

    [dateFormatter release]; ///???
    [today release]; //???
    return now;
}

@end

И я использую класс

- (void)awakeFromNib
{
    Util *ut = [[Util alloc] init];
    NSString* now = [ut getTodayString];
    NSLog(@"User's current time in their preference format:%@",now);

    [currentTime setObjectValue:now];
    [now release]; ///???
    [ut release];
}

Я сбит с толку при освобождении объектов.

В getTodayString::

Q1.[выпуск dataFormatter] необходим?Q2.[сегодня релиз] нужен?

Полагаю, мне не нужно выпускать их, потому что я себя не распределял.Если это правда, когда эти объекты будут освобождены?

In awakeFromNib ::

Q3.[ут релиз] необходим?Q4.[сейчас релиз] нужен?

Полагаю, мне нужно выпустить ut, поскольку я создаю объект явно, но не обращаюсь к объекту now.

  • Как определить, когда объект был выпущен?
  • С python / C # / Java больше не заботятся об освобождении памяти такого рода.С Objective-C все в порядке, если мне плевать на них?

Ответы [ 3 ]

4 голосов
/ 28 февраля 2011

Q1. [выпуск dataFormatter] является необходимо? Q2. [сегодня релиз] необходимо

dataFormatter : да, вы выделяете / инициализируете его.
сегодня : нет, он был возвращен автоматически выпущенным фабричным методом.

Q3. [ут релиз] необходим? Q4. [сейчас релиз] нужен?

То же самое,

ut : да, вы выделяете / инициализируете его.
сейчас : нет, он был возвращен автоматически освобожденным из фабричного метода.

Как определить, когда объект освобожден?

он высвобождается, когда на него вызывается release, если вызывается autorelease, при следующем запуске пула автоматического выпуска будет вызываться release.

Это тоже нормально с Objective-C, если я не волнует их?

Нет, это не хорошо. Если вы не будете убирать за собой, у вас будут существенные утечки памяти, в среде iOS это означает полное отключение вашего приложения. В приложении Mac, которое может привести к потере тонны памяти и не быть хорошим гражданином. Это предполагает, что не сборщик мусора. Т.е. большинство.

Я предполагаю, что суть вашего вопроса в том, что вы не уверены, когда отвечаете за вызов release и когда вы получаете объект autoreleased (точнее, когда вы отвечаете за вызов release для объекта ). Это условно. Если вы вызываете какой-либо метод, который возвращает объект, который не содержит слова: init / copy, то вы не обязаны вызывать release. Если вы сохраняете, вы освобождаете (может быть, есть еще несколько правил, которым нужно следовать, но, по моему мнению, это первое, кто действительно начнет это понимать). Если вы когда-либо вызываете alloc / init / copy, то в какой-то момент вы должны позвонить release.

БОЛЬШОЙ учитель - это сборка и анализ в Xcode. Это быстро укажет, где вы облажались, и действительно поможет понять, что происходит.

1 голос
/ 28 февраля 2011

правила управления памятью просты и понятны. Не думайте с точки зрения сохранения счета, всегда думайте с точки зрения собственности. Когда вы задаете себе вопрос «Мне следует освободить этот объект?», Задайте себе вопрос «Мне принадлежит он?». Rdquo ;. Зафиксируйте правила в памяти, и в конце концов они станут второй натурой.

Чрезвычайно важно соблюдать правила. Если вы игнорируете их, объекты, которыми вы не владеете, могут быть освобождены до того, как вы закончите с ними (например, назначение объектов, которые вам не принадлежат, переменным экземпляра, они могут быть освобождены после того, как пул авто-релиза истощен). Кроме того, если вы проигнорируете их, вы получите ужасные утечки памяти.

1 голос
/ 28 февраля 2011

Независимо от того, заботитесь ли вы об управлении памятью в target-c, зависит от среды, которую вы используете.Если вы используете сборщик мусора, вам не нужно об этом беспокоиться, но сборщик мусора не включен по умолчанию на Mac и совсем не доступен на iOS.Основные правила, когда что-то должно быть выпущено:

  • Если метод, из которого вы получаете это, начинается с alloc или init или содержит слово copy, то вы владеете им и должны выпустить его.
  • Если вы явно сохраняете объект, вы являетесь его владельцем и должны освободить его.
  • Если метод не содержит alloc, init или copy, вы можете предположить, что он был автоматически выпущен.Он будет выпущен автоматически в какой-то момент в будущем, и вам нужно сохранить его, если вы захотите использовать его после возврата текущего метода.

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

...