如何将CGPoint添加到NSMutableArray?

Tat*_*tat 41 iphone objective-c nsarray cgpoint

我想将我的CGPoint存储到NSMutable数组中,所以,我有这样的方法:

[self.points addObject:CGPointMake(x, y)];
Run Code Online (Sandbox Code Playgroud)

但我得到了错误,它说:

"addObject"的参数1的类型不兼容.

所以,我查看了API,

- (void)addObject:(id)anObject
Run Code Online (Sandbox Code Playgroud)

anObject要添加到接收者内容末尾的对象.该值不得为零.

所以,我认为" CGPointMake "可以创建一个Object,但它无法分配.怎么了?

kha*_*son 36

问题是CGPoint实际上只是一个C结构,它不是一个对象:

struct CGPoint {
   CGFloat x;
   CGFloat y;
};
typedef struct CGPoint CGPoint;
Run Code Online (Sandbox Code Playgroud)

如果您在iPhone上,则可以使用NSValue UIKit添加项将CGPoint转换为NSValue对象.

有关示例,请参阅此前一个答案:如何以简单的方式将CGPoint对象添加到NSArray?


atb*_*r11 31

您还可以执行以下操作:

[myArray addObject:[NSValue valueWithCGPoint:MyCGPoint]];
Run Code Online (Sandbox Code Playgroud)


hoo*_*oop 11

不幸的是,CGPoint不是Objective-c对象.它是ac结构.如果Apple双击CGPoint,您应该跳转到定义

struct CGPoint {
    CGFloat x;
    CGFloat y;
};
typedef struct CGPoint CGPoint;
Run Code Online (Sandbox Code Playgroud)

如果要将CGPoint存储在NSArray中,则需要先将它们包装起来.您可以使用NSValue或编写自己的包装器.

请参阅将CGPoint转换为NSValue

编辑>每个objective-c方法调用都有一个小的开销,创建和销毁对象涉及许多方法调用,甚至在它们被用于任何东西之前.你不应该担心这种情况,但对于非常小的物体来说,这些物体封装的行为很少,而且寿命很短,它会影响性能.如果Apple使用对象的所有点,矩形,大小甚至整数,浮点数等表现会更差.