在NSMutableArray中存储指向结构的指针

时间:2014-06-23 21:57:47

标签: ios objective-c pointers

任务:我想创建一个NSMutableArray来保存指向CGPoint结构的指针,然后在其他对象中使用这些指针(自定义,继承自{ {1}})和数组,这样当我更改NSObject中指针后面的实际值时,就会从各处看到它。我不喜欢将它封装在NSMutableArray中的想法,因为这会破坏我想要的功能。

现在有些代码:

NSValue

问题: 我认为这种方式的代码是正确的,包含所有的桥接和东西,但它在插入rawPoints时崩溃,甚至没有到达终点。太伤心了。

问题: 有人可以帮助我理解我做错了什么,并帮助我做对了,所以它按照我描述的方式工作,也许使用不同的对象或方法?

谢谢!

2 个答案:

答案 0 :(得分:5)

与存储指向结构的指针相比,你有一个更基本的问题......

结构是一种值类型,在函数/方法中,这意味着它是在有限的生命周期内自动分配的。在您的代码中:

for (NSInteger i = 0; i < N; i++)
{
    for (NSInteger j = 0; j < M; j++)
    {
        CGPoint p = CGPointMake(j * MRatio, i * NRatio);
        [rawPoints addObject:(__bridge id)&p]; // *** crashes here
    }
}

p的生命周期是从创建点到当前(内部)循环迭代的结束。您尝试存储的&p在您(本例中为失败)存储后立即无效。

您需要将积分存储为,或者如果要进行变异,则将它们存储在动态内存中。有多种方法可以做到这一点,但最简单的方法是创建一个包含CGPoint的简单包装类:

@interface CGPointWrapper

@property CGPoint point;

@end

@implementation CGPointWrapper
// nothing to do
@end

注意:如果您创建CGPoint 属性,如上所述,使用此属性设置结构元素改变存储在类中的值 - 由于值语义。但是,您可以将整个struct值设置为新的CGPoint值。如果您希望设置结构的元素,则需要添加方法来执行此操作。

HTH

答案 1 :(得分:0)

不允许在通常的集合类中存储非对象指针。 According to the docs,有专业的集合类(NSPointerArrayNSMapTableNSHashTable)来处理任意指针的集合。