Подтвердить что ты не робот

Сохраняет ли NSNotification объект?

Мой вопрос касается объекта, который добавляется к методу -postNotificationName:object: userInfo:.

Сохраняет ли NSNotification объект? (аналогично NSMutableDictionary или Array)... означает, что я могу освободить объект после публикации уведомления

Ниже приведен фрагмент кода, который поможет описать мой вопрос... он действителен для освобождения объекта. Ссылка на документацию Apple может быть действительно полезной.

NSMutableDictionary *teamDictCopy = [self.teamDict mutableCopy];
[teamDictCopy setObject:[NSNumber numberWithInt:self.scrollViewIndex] forKey:@"imageIndex"];

if([self.statusButton.title isEqualToString:@"Completed"]){
    [[NSNotificationCenter defaultCenter] postNotificationName:@"UnComplete" object:teamDictCopy userInfo:nil];
}

[teamDictCopy release];
4b9b3361

Ответ 1

"Сохраняет ли NSNotification объект? (аналогично NSMutableDictionary или Array)... что я могу освободить объект после размещение уведомления"

Я не уверен, сохранены ли параметры object и userInfo этим методом или нет, но на практике это не имеет большого значения.

Я думаю, вы можете представить себе, что NSNotificationCenter создает эти уведомления и транслирует их асинхронно, но это не так. Как указано в документации для NSNotificationCenter (см. Ссылка на NSNotificationCenter Reference), уведомления отправляются синхронно:

Центр уведомлений уведомления наблюдателям синхронно. Другими словами, postNotification: методы не вернуться, пока все наблюдатели не получил и обработал уведомление. Для отправки уведомлений асинхронно использовать NSNotificationQueue. В многопоточное приложение, уведомления всегда доставляются в поток, в котором уведомление был опубликован, что может быть не таким нить, в которой зарегистрирован наблюдатель сам по себе.

Итак, в вашем коде центр уведомлений создает уведомление, а затем передает его через центр по умолчанию. Любые объекты, зарегистрированные для этой комбинации имени и объекта уведомления, получат уведомление, а затем выполняют селектор, который они указали при регистрации для этого уведомления. После этого элемент управления возвращается к классу, который отправил уведомление.

Другими словами, к моменту, когда ваш код попадет в строку [teamDictCopy release], teamDictCopy уже будет "использоваться" всеми заинтересованными сторонами. Таким образом, не должно быть никакой опасности в его освобождении.

Просто примечание к условностям. Как правило, параметр object: означает объект, который отправляет уведомление, а параметр userInfo: предназначен для NSDictionary дополнительной информации. Итак, как правило, вы должны обрабатывать уведомление, как показано ниже:

NSMutableDictionary *teamDictCopy = [self.teamDict mutableCopy];
[teamDictCopy setObject:
   [NSNumber numberWithInt:self.scrollViewIndex] forKey:@"imageIndex"];

if([self.statusButton.title isEqualToString:@"Completed"]){
 [[NSNotificationCenter defaultCenter] postNotificationName:@"UnComplete" 
     object:self userInfo:teamDictCopy];
    }

[teamDictCopy release];

Ответ 2

yes - вы можете освободить объект после его установки в качестве объекта уведомления.

вы также можете подклассом.

в отношении конкретного документа/оператора: я не помню его, в частности.

это, однако, является основой для объектов, их переменных экземпляра и распределенной коммуникации и сигнализации, когда типы идентифицируются как объекты.

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

#import <Foundation/Foundation.h>

@interface MONObject : NSObject
@end

@implementation MONObject

- (id)retain {
    return self; /* << add breakpoint here */
}

/* needed to counter retain override
   (although all MONObjects will leak in this example)
*/
- (void)release {
}

@end

int main(int argc, const char* argv[]) {
    NSAutoreleasePool * pool = [NSAutoreleasePool new];

    NSString * name = @"UnComplete";
    MONObject * obj = [MONObject new];
    [[NSNotificationCenter defaultCenter] postNotificationName:name object:obj userInfo:nil];
    [obj release], obj = 0;

    [pool drain];
    return 0;
}