It's important to remember that NSUserDefaults persists data. When you read and write from NSUserDefaults, you're actually reading and writing to/from disc. Whenever you use NSUserDefaults you should ask yourself "Is this something that needs to be persisted between app launches? Could/Should I do this thing without writing to disc?" (note about performance: any time you have to go to disc for something, expect that to take a much longer time)
NSUserDefaults is ideal for things like app settings. Does your app have multiple color schemes the user can choose from? Store those preferences in user defaults and look them up later.
I would put NSUserDefaults in a different category from the other communication patters, like delegation, notifications, blocks, KVO, target-action.
Here's an awesome article about communication patterns in iOS: http://www.objc.io/issue-7/communication-patterns.html . This goes into detail on each one and what they do, and I've found their flow-charts really useful. This article also talks about KVO (key-value observing) and blocks (closures in Swift).
Delegate:

One big difference between the two, where the logic branches in the flow-chart, is whether the recipient knows the sender. You'll often hear notifications talked about as a one-to-many communication where as delegation is one-to-one.
Notifications:
