Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

What type of reference does NSNotificationCenter keep for 'observer's & 'object's?

Can anyone clarify/elucidate the situation with respect to -[NSNotificationCenter addObserver:selector:name:object:]?

  • What types of references are kept by the notification center of the 'observer' and 'object' arguments?

  • What are the best practices for removing observers from the notification center?

  • What are the special concerns for multi-threaded applications, especially with respect to the 'object' argument?

  • What are the differences in behavior of this method in GC and non-GC environments?

  • Are the any significant differences (from a client perspective) between mobile and desktop environments in this method's behavior?

Also, any pointers to existing articles which cover this would be greatly appreciated. I Googled, but was surprised to find little in-depth discussion of these issues (although maybe I didn't use the right magic keywords).

like image 384
Todd Ditchendorf Avatar asked Jan 08 '09 18:01

Todd Ditchendorf


People also ask

What are NSNotificationCenter and how does it work?

NSNotificationCenter provides a centralized hub through which any part of an application may notify and be notified of changes from any other part of the application. Observers register with a notification center to respond to particular events with a specified action.

What is NSNotificationCenter in iOS?

A notification dispatch mechanism that enables the broadcast of information to registered observers. iOS 2.0+ iPadOS 2.0+ macOS 10.0+ Mac Catalyst 13.0+ tvOS 9.0+ watchOS 2.0+

What is NotificationCenter default addObserver?

default — This is the notification variable you can create it globally inside your class if you having more notifications. addObserver(self, — This is for the class where we are going to observer notification.


1 Answers

what types of references are kept by the notification center of the 'observer' and 'object' arguments?

I believe a weak reference, though that's just from memory (no pun intended).

what are the best practices for removing observers from the notification center?

Always remove the registered object from the notification center before they're released. The object's dealloc method is a good place for this if it set up the registration itself, or when you release it if another object is managing the notification subscriptions. Keep this in mind and the above won't matter.

what are the special concerns for multi-threaded applications, especially WRT the 'object' argument?

NSNotificationCenter works fine on threads, but if you send a notification from a background thread, the object will receive it on that same thread. Because of this behavior you should use a different approach if you're updating the UI or doing anything else that's not thread safe (or, dispatch the notification from another method on the main thread).

what are the differences in behavior of this method in GC and non-GC environments?

I don't remember hearing of anything that you need to worry about, though I haven't used the GC much yet.

are the any significant differences (from a client perspective) between mobile and desktop environments in this method's behavior?

Not that I've heard of, no. When you register your object you can choose to register for all notifications or only notifications from a certain object. If you're using notifications heavily the latter may be a little faster, but always test to be sure.

Also, any pointers to existing articles which cover this would be greatly appreciated. I googled, but was surprised to find little in-depth discussion of these issues (although maybe i didn't use the right magic keywords).

I think it's more because NSNotificationCenter is pretty easy to use, in general. If you're worried about certain cases, don't be afraid to write a quick test app!

like image 176
Marc Charbonneau Avatar answered Oct 07 '22 13:10

Marc Charbonneau