Iphone 交换对象。我的脑袋绕不过去

Iphone 交换对象。我的脑袋绕不过去,iphone,objective-c,Iphone,Objective C,好的,如果我有3个对象 ObjectType *objX; ObjectType *objY; ObjectType *tempObjHolder; objX = [[alloc ObjectType] init]; objY = [[alloc ObjectType] init]; // some code to change values in the objX and objY tempObjHolder = objX; objX = objY; objY = tempObjHold

好的,如果我有3个对象

ObjectType *objX;
ObjectType *objY;
ObjectType *tempObjHolder;

objX = [[alloc ObjectType] init];
objY = [[alloc ObjectType] init];

// some code to change values in the objX and objY

tempObjHolder = objX;
objX = objY;
objY = tempObjHolder;
我可以交换对象吗。或者我对这是怎么回事感到困惑。我会让它们都指向一个物体吗

我想做的是使ObjX等于objY,然后使objY等于ObjX

谢谢
-代码

在“等于”和“指向相同的指针”之间有很大区别。您的示例正确地交换了它们,因此指针x和y处的对象交换了位置,但仍然是不同的

但是,由于在示例中没有nil掉tempObjHolder,tempObjHolder和objY都指向同一个对象(最初分配给objX的对象)

此外,正如thyrgle指出的,您在声明中缺少指针:

ObjectType * someObj;

“等于”和“指向相同的指针”之间有很大区别。您的示例正确地交换了它们,因此指针x和y处的对象交换了位置,但仍然是不同的

但是,由于在示例中没有nil掉tempObjHolder,tempObjHolder和objY都指向同一个对象(最初分配给objX的对象)

此外,正如thyrgle指出的,您在声明中缺少指针:

ObjectType * someObj;


这是交换任意两个变量的通用方法,是的,您这样做是正确的(尽管之前的对象创建代码甚至不会编译,因为对象必须是指针,并且
alloc
不是对象)。

这是交换任意两个变量的通用方法,是的,您这样做是正确的(尽管之前的对象创建代码甚至不会编译,因为对象必须是指针,并且
alloc
不是对象).

您的代码甚至不应该工作。Obj-C中的所有对象都是指针。这是一个输入错误。很抱歉。一般来说,您是正确的。我的意思是,这里的逻辑是正确的。假设您左手中有一枚五分镍币,右手中有一枚一角镍币,您想交换它们,但您的手上不能有超过一枚的硬币,您会怎么做?您会这样做把一角硬币放在一个临时的地方(比如说桌面,除非你能神奇地长出第三只手!),将五分镍币换到右边,然后用左边捡起一角镍币。这就是在这里使用临时指针的逻辑。是的,这似乎是合乎逻辑的。但最后它们都指向同一个对象。如果在你问题中完成交换的三行之后,你的指针指向同一个对象,那么它们就是点在交换之前对同一个对象进行测试。你的代码甚至不应该工作。Obj-C中的所有对象都是指针。这是一个输入错误。很抱歉。一般来说,是的,你做得对。我的意思是,这里的逻辑是对的。假设你左手拿着一枚五分镍币,右手拿着一枚一角镍币,你想交换它们,但你不能有超过一枚硬币一只手,你会怎么做?你会把一角硬币放在一个临时的地方(比如说桌面,除非你能神奇地长出第三只手!),将五分镍币换到右边,然后用左边捡起一角镍币。这就是在这里使用临时指针的逻辑。是的,这似乎是合乎逻辑的。但最后它们都指向同一个对象。如果在你问题中完成交换的三行之后,你的指针指向同一个对象,那么它们就是点在交换之前对同一个对象进行ting。Joshua应该在什么阶段将tempObjHolder设置为nil?我测试了这一点,结果发现objX和ObjY是同一个对象。因为当我尝试更改ObjY时,结果同时出现在objX和ObjY中。最后一步是将tempObjHolder设置为nil。这通常不会完成,因为tempObjHolder应该是declared,这样当你完成它时,它就超出了范围。Joshua在什么阶段应该将tempObjHolder设置为nil?我测试了这一点,最后objX和ObjY是同一个对象。因为当我尝试更改ObjY时,结果同时出现在objX和ObjY中。你会将tempObjHolder设置为nil作为最后一步。这通常不会完成,因为这是一步应该声明mpObjHolder,以便在使用它时它超出范围。