1

オブジェクト自体を削除せずに、別の配列のオブジェクトを指すNSMutableArrayのポインターを削除しようとしています。例えば:

// In ViewController.m – Code abridged and somewhat simplified

@interface ViewController ()
@property (nonatomic, strong) NSMutableArray *objectPool;
@property (nonatomic, strong) NSMutableArray *objectsOwnedByFriend;
@property (nonatomic, strong) NSMutableArray *objectsOwnedByMe;
- (void)transferPointerToObjectFromFriendToMe;
- (void)copyPointerToObjectFromFriendToMe;
@end

@implementation ViewController

@synthesize objectPool = _objectPool;
@synthesize objectsOwnedByFriend = _objectsOwnedByFriend;
@synthesize objectsOwnedByMe = _objectsOwnedByMe;

- (void)setObjectPool:(NSMutableArray *)objectPool
{
    _objectPool = objectPool;
}

- (NSMutableArray *)objectPool
{
    if (!_objectPool) _objectPool = [[NSMutableArray alloc] initWithArray:self.objects]; // self.objects is a mutable array containing multiple NSObjects
    return _objectPool;
}

- (void)setObjectsOwnedByFriend:(NSMutableArray *)objectsOwnedByFriend
{
    _objectsOwnedByFriend = objectsOwnedByFriend;
}

- (NSMutableArray *)objectsOwnedByFriend
{
    if (!_objectsOwnedByFriend)
    {
        _objectsOwnedByFriend = [[NSMutableArray alloc] init];
        [_objectsOwnedByFriend addObjectsFromArray:self.objectPool];
    }
    return _objectsOwnedByFriend;
}

- (void)setObjectsOwnedByMe:(NSMutableArray *)objectsOwnedByMe
{
    _objectsOwnedByMe = objectsOwnedByMe;
}

- (NSMutableArray *)objectsOwnedByMe
{
    if (!_objectsOwnedByMe) _objectsOwnedByMe = [[NSMutableArray alloc] init];
    return _objectsOwnedByMe;
}

- (void)transferPointerToObjectFromFriendToMe
{
    [self.objectsOwnedByMe addObject:[self.objectsOwnedByFriend lastObject]];
    [self.objectsOwnedByFriend removeLastObject];
}

- (void)copyPointerToObjectFromFriendToMe
{
    [self.objectsOwnedByMe addObject:[self.objectsOwnedByFriend lastObject]];
}

@end

上記のコードで、transferPointerToObjectFromFriendToMeを使用すると、最後のオブジェクトを削除すると、self.objectsOwnedByFriend内のオブジェクトへのポインター(必要に応じて)と、self.objectPool内のオブジェクト自体(発生したくない)の両方が削除されます。

私が欲しいのは、実際のオブジェクトをすべて含む配列(self.objectPool)と、self.objectPool内のオブジェクトへのポインターとさらに追加および削除する機能を含む2つの可変配列(self.objectsOwnedByFriendおよびself.objectsOwnedByMe)です。 self.objectPool内のオブジェクトをself.objectsOwnedByFriendおよびself.objectsOwnedByMeに参照するポインター。

また、transferPointerToObjectFromFriendToMeまたはcopyPointerToObjectFromFriendToMeのいずれかを使用すると、self.objectsOwnedByMe.countによる後続のチェックの結果が1ではなく0になるため、オブジェクトが適切に追加されていないようです。
解決策=self.objectsOwnedByMeの遅延インスタンス化が元のコードにありませ
んでした:Sself.objectsOwnedByMeが適切に作成されたかどうかを次の方法で確認できました。

NSLog(@"self.objectsOwnedByMe = %@", self.objectsOwnedByMe);

**私の最初のStackOverflowの質問!**私は明確だったと思います...同様の質問を見つけることができなかったので、古いスレッドを見逃した場合はお詫びします。診断するためにさらに情報が必要な場合はお知らせください。(私はObj-Cを学ぼうとしています。)

4

3 に答える 3

1

タイプミス:Pごめんなさい。Xcodeの実際のコードでは、次のようになりました。

- (void)setObjectPool:(NSMutableArray *)objectPool
{
    _objectPool = objectPool;
}

- (NSMutableArray *)objectPool
{
    if (!_objectPool) _objectPool = [[NSMutableArray alloc] initWithArray:self.objects];
    return _objectsOwnedByFriend;
}

私の間違いは非常に明白だと思います(そうでない場合、間違いは私のゲッターが...コピー/貼り付けエラーをobjectPool返していたということでした)。_objectsOwnedByFriend

すべてが機能するようになりました。

于 2012-05-07T00:27:24.157 に答える
0

これは非常に独特で紛らわしいコードです。問題は、何かがセッターの1つ、-setObjectPool:または-setObjectsOwnedByFriend:、他のオブジェクトの配列を呼び出していることだと思います。これらのセッターは、渡されたオブジェクトをivarに参照させるだけです。そのため、オブジェクトが共有される可能性が非常に高くなります。

copy通常、そのようなプロパティは、セマンティクスを使用して宣言および実装されます。

于 2012-05-05T04:30:01.503 に答える
0

初期化されていないように見えるため、実際のNSMutableArrayの代わりにself.objectsOwnedByMe常に作業しています。nil

どこかで(おそらく、以下のobjectsOwnedByMeのカスタムゲッターで?)、使用を開始する前に配列を作成する必要があります。

- (NSMutableArray *)objectsOwnedByMe {
    if (_objectsOwnedByMe == nil) {
        _objectsOwnedByMe = [[NSMutableArray alloc] init];
    }
    return _objectsOwnedByMe;
}

これは両方の問題を説明しnilます。オブジェクトが保持されないため、他の配列から削除されるとオブジェクトが消え、また、オブジェクトが_objectsOwnedByMe配列に追加されない理由も説明します。

于 2012-05-05T06:21:13.163 に答える