更新:我意识到永远不会调用“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,也是合成的。
答案 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
被召唤。