【问题标题】:Remove pointer to object from NSMutableArray while keeping object?在保留对象的同时从 NSMutableArray 中删除指向对象的指针?
【发布时间】:2012-05-05 03:46:36
【问题描述】:

我正在尝试删除 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。
解决方案 = 我的原始代码中缺少 self.objectsOwnedByMe 的惰性实例化:S
我能够检查 self.objectsOwnedByMe 是否通过以下方式正确创建:

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

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

【问题讨论】:

  • 您应该实际提交一个答案并将该答案标记为选中,而不是编辑您的原始问题以包含解决方案。从搜索来自谷歌的答案的人的角度来考虑它。他们喜欢找到已被接受的正确提出的问题和答案。
  • 顺便说一句,欢迎光临,希望您过得愉快
  • 现在我看到...隐藏在页面底部!谢谢。

标签: objective-c pointers nsmutablearray


【解决方案1】:

错字:P 抱歉偷看。在我在 Xcode 中的实际代码中,我有:

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

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

我认为我的错误非常明显(如果不是,错误是我的 objectPool 获取器返回 _objectsOwnedByFriend...复制/粘贴错误,我不知何故错过了)。

现在一切正常!

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 嗨,Ken:我仍然对你的意思有些困惑。我认为我确实希望对象被“共享”。我只想要一个包含实际对象(self.objectPool)的源数组,然后是引用这些对象的其他数组(self.objectsOwnedByFriendself.objectsOwnedByMe),而不需要对它们进行任何操作。你是说copy 是唯一的出路吗?当然,必须有一种方法可以在不复制实际对象的情况下做到这一点(例如,如果对象非常大;或者,如果我确实想要一个对象,我可以操纵它,随后会影响指向它的所有对象)。
    • 如果我理解你,你想要独立的数组,但你希望数组指向与元素相同的对象。我要说的是你可能没有独立的数组。您可能正在使多个 ivars 指向同一个数组。如果你复制一个数组,它是一个浅拷贝。你得到一个新数组,但它仍然指向与复制的数组相同的元素,这就是你想要的。
    • 嗨,肯:感谢您的澄清。看来我的问题是addObject:。由于这带来了一系列全新的问题,如果新线程解决了问题(而不是在这些 cmets 中提出新问题),我将启动一个新线程并解决此线程。
    • 我发布了一个新问题,可能与此相同也可能不同,但措辞不同。如果是这样,道歉!但是如果找到答案,希望两者可以合并......诀窍是弄清楚如何提出正确的问题:stackoverflow.com/questions/10466863/…
    • 好的,我现在回到原来的问题,因为我的addObject 问题已经解决。 copy-ing 对象似乎仍然没有解决问题,因为 [self.objectsOwnedByFriend removeLastObject] 仍然会从 self.objectPool 中删除对象。
    【解决方案3】:

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

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

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

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

    【讨论】:

    • 抱歉,代码中确实有!我已经更新了问题以包括 self.objectsOwnedByMe 的 setter 和 getter :S
    猜你喜欢
    • 2011-05-02
    • 2013-07-05
    • 2014-04-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-29
    • 1970-01-01
    相关资源
    最近更新 更多