The spawn action is an object action, the create object is a system action.
The consequence of this design, is that if you call the spawn action each picked object will spawn something
The second difference is that the spawn creates an object at the position of the calling object.
In short, spawn is equivalent to:
foreach object -> create object at object.X, object.Y
As far as retreiving UIDs, you shoudl be able to do it like that:
-> Create/Spawn object
-> set variable to object.UID
For IIDs I don't know exactly when IIDs are assigned and/or reevaluated. But usually, since there shouldn't be any "hole" in the IIDs the one attributed to the newly created object should be equal to object.Count. (ie: if you have 3 objects they probably have the IID 0,1,2 so the next one will be 3)
But you shouldn't rely too much on IIDs, I don't exactly know when they are assigned or recalculated, and with so much imprecision you really should use your own indexing (with your own instance variable), and C2 could change their way of doing things. IID are good for temporary uses or when the state of instances don't change.
When there's creation/destruction involved, you're better off handling things yourself or using UIDs.