我试图删除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。)
答案 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数组中。