I think one of the reasons are that all macro defined elements in your code will be recognized by UE´s garbage collection, as you may know c++ doesnt come with a
garbage collector.
edit: means if you place UBlahblahblah above a variable(Probably pointertype) it will be garbage collected in case its unreferenced. Dont think you would put one over primitives though
hey, yes thats right, means you dont need to provide UFUNCTION() for functions that wont be used in some of unreals magic but for example if
you make a Timeline and want to bind a function to it you have to mark it as UFUNCTION.
You will notice that it even compiles without the macro but if you test it your bound function wont get called.
For UObjects this is true, UObjects are memory managed by UE4 by reference counting. If you have a UObject* variable in your class and it isn’t declared a UPROPERTY, your UObject can be falsely garbage collected!