2012-11-24 71 views
0

我有以下問題,因爲我剛開始編碼objective-c。交換指向對象的兩個變量的值

我有一些實例與

@interface MyClass 
    @property (strong) MySecondClass *first; 
    @property (strong) MySecondClass *second; 
@end 

@implementation MyClass 
    @synthesize first = _first; 
    @synthesize second = _second; 

    /*this is called while initialisation*/ 
    -(void) initialisation{ 
     _first = [[MySecondClass alloc] init]; 
     _second = [[MySecondClass alloc] init]; 
    } 

    /*what i want to do*/ 
    -(void) swap{ 
     // second one should be replaced with first one 
     _second = _first; 

     // first pointer should be replaced by new instance 
     _first = [[MySecondClass alloc] init]; 
    } 

@end 

問題是,當我打電話交換法,_First仍然指向舊的對象,以便_second將同新的對象來代替。

我已經試過像下面這樣的副本,但是會引發異常。

_second = [_first copy]; 

PS:IM使用ARC

編輯

我真的想完成,會是這樣的:

_second = _first 
MySecondClass *tmp = [[MySecondClass alloc] init]; 
_first = &tmp; 

但是這表明編譯器錯誤:隱將間接指針轉換爲指向「MySecondClass *」的Objective-C指針不允許使用ARC

在此先感謝。

+0

拋出什麼樣的異常?控制檯應該顯示。 –

+0

例外: 未捕獲的異常: - [MySecondClass copyWithZone:]:無法識別的選擇器發送到實例0xf305570 我不想複製內存,只是指向它的指針。 _first指針應該指向一個新的對象。 – Dom

+0

我總是遇到這種問題,最後我寫了copyWithZone。有一種叫做deepcopy和shallowcopy的背後原因。 –

回答

-1

What i really would like to accomplish, would be something like:

_second = _first 
MySecondClass *tmp = [[MySecondClass alloc] init]; 
_first = &tmp; 

But this shows compiler error: Implicit conversion of an indirect pointer to an Objective-C pointer to 'MySecondClass *' is disallowed with ARC

這是因爲_first_secondtmp值已經指針,所以「&tmp」是一個指向指針的「間接指針」(編譯器作者的部分不是特別明確的措詞) 。

有沒有解決方案&tmp。您只需在此處輸入tmp

+0

我發現我的問題比我簡化的例子稍微複雜一些。你是對的,我的交換功能做它應該做的事,但它不能解決我的複雜問題。我需要深入瞭解視圖控制器的工作方式。不管怎麼說,多謝拉。 – Dom

0

我的新答案:

你也應該讓某些你試圖複製類實現"NSCopying" protocol。例如,UIViewController doesn't implement it,因此它不會響應對「複製」或「copyWithZone」的呼叫。

嘗試用與「copy」不同的方式重置該指針。

我原來的答覆:

嘗試通過其訪問器指的是性能。

例如爲:

self.second = self.first; 

self.first = [[MySecondClass alloc] init]; 

只有你必須以 「_second」 & 「_first」 是直接在類init方法工作的地方。

+0

謝謝,我已經嘗試過了,但它是一樣的。順便說一下,我沒有取代setter和getters。 – Dom

+1

重點是,我真的不想複製實例。我只想交換一個INSTANCE的指針。到目前爲止,_second指針指向INSTANCE,但現在我想將_first指針替換爲NEW。 – Dom