Почему должен я писать [anView выпуск], anView = ноль; вместо [anView выпуск];?

С помощью openCallBack вы можете определить свою функцию, которая будет динамически изменять состояние пунктов контекстного меню или выполнять любые другие действия, когда меню открывается по щелчку, перед его отображением:

function ContextMenu(contextContainerID, menuItemClickCallback, options)
{
    // skipped

    this.contextMenuContainer.click(function(e){

        // skipped

        if (options != null && typeof options !== "undefined" )
        {
            if (typeof options.openCallBack !== "undefined")
            {
                options.openCallBack(self);
            }
        }

        // skipped

        contextMenu.show();
        return false;
    });

    // skipped
}
7
задан Thanks 30 April 2009 в 08:25
поделиться

5 ответов

вместо того, чтобы делать выпуск expicit и установить значение nil, если ваши аксессоры имеют свойства, связанные с ними yoc, и выполните следующие действия в качестве более краткого метода:

- (void) dealloc
{
    self.retainedProperty1 = nil;
    self.retainedProperty2 = nil;
    self.copiedProperty = nil;
    self.assignedProperty = nil;
}

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

Изменить: я должен указать, что ваши свойства не могут быть доступны только для чтения, иначе вы получите ошибки компилятора по очевидным причинам :)

1
ответ дан 6 December 2019 в 05:49
поделиться

Какой-то другой метод мог бы по какой-то причине -сохранить представление

Если вы сами не вызываете dealloc , он вызывается только тогда, когда счет удержания становится равным нулю

Обратите внимание, что в Objective-C отправка сообщения на ноль «объект» (часто) совершенно в порядке. В этом случае не остановит вашу программу, но сообщение просто игнорируется. Однако вы не можете отправить сообщение освобожденному объекту, что приведет к аварийному завершению.

Итак, следующее может привести к ошибке:

[anView release];
[anView doSomething];

Но на самом деле это нормально:

[anView release];
anView = nil;
[anView doSomething];

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

См. также Отправка сообщений на ноль из Apple '

11
ответ дан 6 December 2019 в 05:49
поделиться

Метод -dealloc вызывается, когда объект освобожден, и никакие другие методы для объекта не будут выполнены после. Следовательно, установка для любой переменной экземпляра значения nil не оказывает никакого влияния на этот объект.

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

4
ответ дан 6 December 2019 в 05:49
поделиться

Я часто использую этот шаблон:

- (void) showHelp: (id) sender
{
    if (helpController == nil)
    {
        helpController = [[HelpController alloc] initWithNibName: @"Help" bundle: [NSBundle mainBundle]];
    }
    [self presentModalViewController: helpController animated: YES];    
}
- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning]; // Releases the view if it doesn't have a superview
    // Release anything that's not essential, such as cached data
    [helpController release];
    helpController = nil;
}

Довольно везде, где я размещаю viewcontroller, который является модальным или иначе "временным". Таким образом, он зависает, если мне снова это нужно, но уходит, если памяти становится мало.

2
ответ дан 6 December 2019 в 05:49
поделиться

Принцип является более общим, чем UIView. на самом деле это более общий метод, чем Objective-C / Cocoa -релиз . Это также верно для функций памяти C malloc () / free () .

Когда вам больше не нужен объект или какая-либо зона памяти, сначала вы отпускаете / освобождаете его. Затем, чтобы убедиться, что вы не будете использовать его снова,

14
ответ дан 6 December 2019 в 05:49
поделиться
Другие вопросы по тегам:

Похожие вопросы: