* You have an object. You call retain on it. You have a count of one.
* You also have a pointer to that object. The "borrow" in your analogy.
* You return this pointer, and stash it somewhere. The object still has a count of one, so it's still live, so this is okay.
* Later in your program, you use that pointer to call release.
Here, we've only ever had a reference count of one, but our object has lived across arbitrary inner scopes. In Rust, this would not work, unless you dropped into unsafe.
Obviously, with Arc and autoretain this kind of code doesn't get written anymore, I would hope. And even without, it wouldn't be guaranteed, so you'd want the "borrow" to actually bump the refcount. But Rust is about guaranteeing that it can't.