Any pointers to help me understand this issue would be greatly appreciated 
First of get rid of the pointers for
TMqttClient.TMqttApplicationMessage and
TMqttApplicationMessage.GetData. Object Pascal style classes already
are pointers and function/method variables are pointer types as well.
Then best use a generic list for
TMqttClient.GetData (and I personally wouldn't name that field
GetData, cause with the
Get prefix I'd assume it to be a method). For example by using unit
Generics.Collections and using
specialize TList<TNamedDelegate> instead of
TList (you'll also have to move the declaration of
TNamedDelegate further up - after the declaration of
TMqttMessage - and add a forward declaration for
TMqttClient before
TNamedDelegate (
TMqttClient = class;)).
Then inside your
TMqttClient.Create you don't need to use
TNamedDelegate(@Self.OnGetData).
@Self.OnGetData or even
@OnGetData is enough (also I wouldn't name that method
OnGetData, cause the
On prefix is usually used for event properties (properties of type method pointer). And you don't need to use the dereferentiation operator as well nor the
@tmp or
@del.
So first clean this up, post the cleaned up code and then we can check what is really going on if that doesn't already fix your issues.