When to use references directly, when via AssetReference?

I am currently trying to better understand Unity techniques by means of an example project.
The project is designed so that many scenes are bundled into AssetBundles.
At one point, when it comes to addressable assets and scriptable objects, I don’t understand why different approaches are chosen in the example.

The author links the AddressableObject sometimes as AssetReference, which has to be loaded async, but sometimes also as a diect reference.

My question is therefore: What difference could there be between the following situations:

[SerializeField] private AssetReference mySOAssetReference;

private void DoSomething()
{
    mySOAssetReference.LoadAssetAsync().Completed += (mySO) => {
        myAsset.Result.DoItNow();
    }
}

V.S.

[SerializeField] private MyScripableObject mySO;

private void DoSomething()
{
    mySO.DoItNow();
}

By the way: It’s about the former Unity Open Project “Chop Chop”. The author uses this procedure to exchange events between several scenes. In the initialisation scene the event is loaded as AssetReference, but in the scene “PersistenceManagers” the same ScriptableObject is accessed via direct reference.

I would say the main difference is that addressables allows you to free up memory when youre done with an SO by releasing it. A direct reference will always be loaded into memory. This usually isn’t a big issue unless you have a ton of these or very heavy SOs

I’m not familiar with that project but I’d assume they would load it by asset ref in startup so it can do it’s thing then release it from memory when it’s done. Where as the persistent one might always be loaded anyway, so may as well use a direct ref. (Could also be an asset ref if u really wanted to)

Ah, I see, thank you for the answer!

Would I have to unload the AssetRefrence manually, or would that happen automatically when the “init” scene (the one that contains the script that loads the SO) is unloaded?

you have to unload it yourself, so going off your example youd just release the handle after DoItNow()