在保留对象的同时从NSMutableArray中删除指向对象的指针?

时间:2012-05-05 03:46:36

标签: objective-c pointers nsmutablearray

我试图删除NSMutableArray中指向另一个数组中的对象而不删除对象本身的指针。 E.g:

// 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。 我能够检查self.objectsOwnedByMe是否通过以下方式正确创建:

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

**我的第一个StackOverflow问题! **我希望我很清楚......如果我错过了一个旧线程,就找不到类似的问题。如果您需要更多信息来诊断,请告诉我。 (我正在努力学习Obj-C。)

3 个答案:

答案 0 :(得分:1)

错字:P对不起偷看。在我在Xcode中的实际代码中,我有:

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

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

我认为我的错误是非常明显的(如果没有,那么错误就是我的objectPool的getter正在返回_objectsOwnedByFriend ...复制/粘贴错误我不知何故错过了。

现在一切正常!

答案 1 :(得分:0)

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

通常,使用copy语义声明和实现类似的属性。

答案 2 :(得分:0)

看起来self.objectsOwnedByMe永远不会被初始化,因此您始终使用nil而不是实际的NSMutableArray。

某处(也许是对于ObjectsOwnedByMe的自定义getter,如下所示?)你需要在开始使用它之前创建一个数组:

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

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