@property (nonatomic, assign) id <IconDownloaderDelegate>делегат; - PullRequest
3 голосов
/ 11 сентября 2011

Кто-нибудь может объяснить мне, что означает эта строка?Я использую, чтобы увидеть (неатомный, сохранить), впервые я вижу ключевое слово "assign" в:

@property (nonatomic, assign) id <IconDownloaderDelegate> delegate;

Спасибо за вашу помощь,

Стефан

Ответы [ 3 ]

8 голосов
/ 11 сентября 2011

Опираясь на ответ Петра:

Когда вы создаете свойство, вы можете автоматически создавать методы получения и установки с помощью директивы @synthesize. Компилятор не только создает два метода

 - (id) delegate;
 - (void) setDelegate: (id) newDelegate; 

, но также содержит дополнительный код для предотвращения одновременного изменения свойства несколькими потоками (по сути, блокировка). nonatomic сообщает компилятору, что код не должен быть потокобезопасным, что означает меньший код и лучшую производительность.

Сеттер, созданный компилятором с retain, будет выглядеть примерно так:

- (void) setDelegate: (id) newDelegate {
    if (delegate != newDelegate) {
        [delegate release];
        delegate = [newDelegate retain]; 
    }
}

и именно поэтому вам нужно освободить сохраненные свойства в методе dealloc вашего класса.

Поскольку общий совет заключается в том, чтобы не оставлять своего делегата, вы используете assign вместо retain, и установщик будет выглядеть так:

- (void) setDelegate: (id) newDelegate {
    if (delegate != newDelegate) {
        delegate = newDelegate;
    }
}
2 голосов
/ 11 сентября 2011

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

присвоить

Указывает, что сеттер использует простое назначение. Этот атрибут используется по умолчанию.

Этот атрибут обычно используется для скалярных типов, таких как NSInteger и CGRect, или (в среде с подсчетом ссылок) для объектов, которыми вы не владеете, например, для делегатов.

функции сохранения и назначения практически одинаковы в среде сбора мусора.

1 голос
/ 11 сентября 2011

Assign - это просто присваивание типа int x = y без управления памятью (как с retain).

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