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

問題は、swapメソッドを呼び出すと、_firstが古いオブジェクトを指しているため、_secondが同じ新しいオブジェクトに置き換えられることです。

私はすでに次のようにコピーを試みましたが、例外がスローされます。

 _second = [_first copy];

PS:私はARCを使用しています

編集

私が本当に達成したいことは、次のようなものです。

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

しかし、これはコンパイラエラーを示しています。「MySecondClass*」へのObjective-Cポインタへの間接ポインタの暗黙的な変換はARCでは許可されていません。

前もって感謝します。

4

2 に答える 2

0

私の新しい答え:

また、コピーしようとしているクラスが" NSCopying" プロトコルを実装していることを確認する必要があります。たとえば、UIViewController はそれを実装していないため、"copy" または " " の呼び出しには応答しませんcopyWithZone

" " を使用するのとは別の方法で、そのポインターをリセットしてみてくださいcopy

私の元の答え:

アクセサーを介してプロパティを参照してみてください。

例えば:

self.second = self.first;

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

_second" " & " _first" を直接操作しなければならない唯一の場所は、クラスの init メソッドです。

于 2012-11-24T15:11:12.473 に答える
-1

私が本当に達成したいのは、次のようなものです。

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

しかし、これはコンパイラ エラーを示しています: 'MySecondClass *' への Objective-C ポインターへの間接ポインターの暗黙的な変換は、ARC では許可されていません

これは_first、 、_second、およびの値tmpが既にポインターであるためです。そのため、「<code>&tmp」はポインターへのポインター、つまり「間接ポインター」です (コンパイラー作成者の明確な表現ではありません)。

そこの解決策は言わないこと&tmpです。あなたはtmpここに欲しいだけです。

于 2012-11-24T18:12:01.340 に答える