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.objectsOwnedByFriend 和 self.objectsOwnedByMe),其中包含指向 self.objectPool 中对象的指针以及添加和删除更多对象的能力将 self.objectPool 中的对象指向 self.objectsOwnedByFriend 和 self.objectsOwnedByMe 的指针。

此外,当我使用 transferPointerToObjectFromFriendToMe 或 copyPointerToObjectFromFriendToMe 时,似乎没有正确添加对象,因为通过 self.objectsOwnedByMe.count 进行的后续检查会导致 0 而不是 1。
SOLUTION = 我的原始代码中缺少 self.objectsOwnedByMe 的惰性实例化:S
我能够通过以下方式检查 self.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;
}

我认为我的错误非常明显(如果不是,错误是我的 getterobjectPool正在返回_objectsOwnedByFriend......我以某种方式错过的复制/粘贴错误)。

现在一切正常!

于 2012-05-07T00:27:24.157 回答
0

这是非常奇特和令人困惑的代码。我怀疑问题是某些东西正在调用其中一个设置器,-setObjectPool:或者-setObjectsOwnedByFriend:,与另一个对象的数组一起调用。这些设置器只是让 ivar 引用传入的对象。因此,它们很容易导致对象被共享。

通常,像这样的属性将使用copy语义声明和实现。

于 2012-05-05T04:30:01.503 回答
0

它看起来self.objectsOwnedByMe从未初始化,因此您总是使用nil而不是实际的 NSMutableArray。

在某个地方(也许在下面的 objectsOwnedByMe 的自定义 getter 中?)您需要在开始使用它之前创建一个数组:

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

这可以解释这两个问题:因为nil它永远不会保留对象,因此当它们从另一个数组中删除时它们会消失,以及为什么它们永远不会添加到 _objectsOwnedByMe 数组中。

于 2012-05-05T06:21:13.163 回答