userInfo is for the user to decide. The user in this case is the developer. An example might be a timer that's meant to go off at a set of times that are not regular, say 1 sec, then 4 secs, then 10 secs. The userInfo could be an array holding those times and each time the timer goes off it sets the next time to go off from the list. When the timer is first created the array is created and the userInfo is set to the timer. Then the array could have one value removed. Then a new timer is created with the new array. And so on.
In most cases there are other ways to accomplish things that the userInfo might be used for but sometimes it's the most convenient way. It's kind of like the userInfo in NSNotification and NSError. Use it for whatever you want.