任务:我想创建一个NSMutableArray
来保存指向CGPoint
结构的指针,然后在其他对象中使用这些指针(自定义,继承自{ {1}})和数组,这样当我更改NSObject
中指针后面的实际值时,就会从各处看到它。我不喜欢将它封装在NSMutableArray
中的想法,因为这会破坏我想要的功能。
现在有些代码:
NSValue
问题: 我认为这种方式的代码是正确的,包含所有的桥接和东西,但它在插入rawPoints时崩溃,甚至没有到达终点。太伤心了。
问题: 有人可以帮助我理解我做错了什么,并帮助我做对了,所以它按照我描述的方式工作,也许使用不同的对象或方法?
谢谢!
答案 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,有专业的集合类(NSPointerArray
,NSMapTable
和NSHashTable
)来处理任意指针的集合。