跟踪可变数组中的触摸点

时间:2011-06-05 22:12:40

标签: objective-c cocoa-touch ios uiview

更新:我意识到永远不会调用“initWithFrame”方法,因此我将数组的init放在其他位置。谢谢阅读。 (对于任何人来说,如果没有调用initWithFrame,那又有什么意义?“

我一直盯着这段代码大约一个小时,我可能错过了一个简单而明显的问题。我只想保留一系列触摸点。我的UIView的初始化说:

- (id)initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame];
if (self) {
    // Initialization code
}
self.drawn=[[NSMutableArray alloc] init ];
return self;
}

然后我用另一种方法:

CGPoint point=[[touches anyObject] locationInView:self];
NSLog(@"touched point: %f, %f",point.x,point.y);
[self.drawn addObject:[NSValue valueWithCGPoint:point]];

NSLog确认存在“点”并包含x和y数据。

为什么我的“绘制”数组永远不会得到任何东西?我已经阅读了NSValue教程,我似乎正确地做到了这一点。尽管此代码已被触发,[self.drawn count]的NSLog始终显示为0。

当然,“绘制”也是我自定义UIView的ivar,也是合成的。

2 个答案:

答案 0 :(得分:3)

您的initWithFrame:永远不会被调用,*且永远不会创建drawn。来自Resource Management Guide

  

在iOS中,使用NSCoding方法初始化符合initWithCoder:协议的任何对象。这包括UIView的所有子类[...] iOS中的自定义视图不使用initWithFrame:方法进行初始化。

因此drawn的值为nil,而[nil count]的调用值为0; [nil addObject:]同样没有任何作用。

那就是说,你的initWithFrame:也有两个内存问题。您对属性的赋值会过度保留数组,您应该在if块中进行该分配。

使用NSMutableArray / alloc创建init时,您拥有该数组。当您使用定义为保留的属性分配它时,您对该对象有额外的声明,这最终可能导致泄漏。

第二:如果由于某种原因,对[super initWithFrame:frame]的调用失败,self将无效(nil),并且使用其中一个属性同样不正确。这就是if(self)的目的。 你应该这样做:

if(self){
    self.drawn = [NSMutableArray array];
}

这会创建一个自动释放的NSMutableArray,然后您的视图会正确保留。


*我希望我也知道为什么。它 在OS X中使用。

答案 1 :(得分:0)

我会检查是否

- (id)initWithFrame:(CGRect)frame

被召唤。