__owned is solely about ARC convention, an __owned parameter still lives for the entire duration of the function’s execution, so if you mutate it inside the function it will always copy since the parameter itself is immutable and cannot be eagerly moved into something mutable.