With the reference counting, the objects can be reclaimed right after they’re no longer referenced. It doesn’t require running a separate thread for GC.
Other GC methods, such as mark and sweep, runs on its own thread and we cannot determine when it runs Maybe the youngest generation is reclaimed when the function returns, but some other objects which are pushed to the next generation might be garbage as well.
Is there any other GC method which reclaims the objects at determined time?
If by “at determined time” you mean “as soon as possible, in the absence of cycles”, then no. You need naive reference counting for that, with all its problems, you can’t even use any of the optimizations of reference counting (such as deferred reference counting).
If times like “at the end of a scope” are acceptable, then yes, it’s possible (though not advisable). You just run whatever form of GC you have at that time. This is, of course, highly inefficient, which is one reason nobody does it (the other being that the only advantage, deterministic cleanup, is rarely needed and better handled explicitly). Incremental GCs may alleviate this a bit, but I’m not sure how much.