0

我有内存问题(是的;)我是 iOS 新手)在自定义 UIView 中使用以下方法:

头文件

....    
@property (nonatomic, retain) NSString * pressureTextLabel;
....

实现绘制一个圆圈和一个带有与触摸相关的压力的标签。每次手指触摸都会创建此视图的对象:

- (void)drawRect:(CGRect)theRect{
    CGRect rect = self.bounds;
    CGRect ringRect = CGRectInset(rect, 100, 100);

    // Outer ring.
    UIBezierPath *path = [UIBezierPath bezierPathWithOvalInRect:ringRect];
    ringRect = CGRectInset(rect, 60, 60);
    [path appendPath:[UIBezierPath bezierPathWithOvalInRect:ringRect]];
    path.usesEvenOddFillRule = YES;
    [self.color set];
    [path fill];

    //text label
    rect = CGRectMake(100, 20, 100, 100);

    //This one seems to be the troublemaker
    [pressureTextLabel drawInRect:rect withFont:[UIFont systemFontOfSize:14.0]];

}

只要控制器不调用以下方法来更新此特定触摸的感测压力,一切都可以正常工作。

-(void) setTouchPressureTo: (float) pressure{

    pressureTextLabel = [NSString stringWithFormat:@"%f", pressure];
    [self setNeedsDisplay];

}

我收到以下错误:

*** -[CFString drawInRect:withFont:]: message sent to deallocated instance 0x16e8c0

这让我在应用程序崩溃后调查调试控制台中的内存跟踪:shell malloc_history <PID> 0x17dfb0. 结果控制台返回:

malloc_history cannot examine process 5838 because the process does not存在。

所以这里的问题:

  1. 有人可以在这里看到明显的保留、释放问题吗?
  2. 我怎样才能malloc_history <PID> <Address> 工作?

感谢您的时间,重定向和答案!

基督教

4

1 回答 1

2

问题是您将自动释放的对象(您的[NSString stringWithFormat...])分配给 ivar(pressureTextLabel)。您应该改用属性访问,如self.pressureLabel = ....

于 2011-01-28T01:12:30.940 回答