You doing very strange things here
BlueprintFunctionLibrary function is practically only cosmetic, it is only used as namespace. lot of people get confused that it has some importence for blueprint but there practicly none, other then simply collects static functions what are binded by blueprint, but you can do blueprint nodes from any point of UObject class tree. Infact you should make nodes out of non-static functions inside classes that they effect. So BlueprintFunctionLibrary object should never be created and it should only contain static functions.
Insted whatever you trying to do you should make object class out of UObject which handles task you seeking, optionally you can make struct containing data you need and use static functions to do operations on them, you might find that a lot simpler and lighter solution.
Outer is object that own the created object, for example let say you got class managing internet connections and each internet connection got a object that controls connection direcly, in this case outer of those ocnneciton objects will be object managing them. UE4 use outer to manage objects and memory manageing stuff like that. So generally you plug Self.
But Outer has no issue… you clearly creating MyBlueptinFunctionLibary not iOSBlueprintHandle that dirives from it, you can’t magicly turn parent class object to child class object, you need to create iOSBlueprintHandle. Casting don’t change object class, they only change variable type not object itself. in C++ there is possibility to do so but UObject due to there manageing code are quite limited on that matter, there is duplication function which allows to copy UObject to diffrent class but it needs to be in same size in memory to do so (not extra variables)