0

所以我正在开发一个应用程序,并且我没有使用自动引用计数,所以我必须自己进行内存管理。我有这段代码,它在第一种方法中为 UIView 的图层设置了一个值。然后在第二种方法中,我检索它。array1 在我的viewDidLoad

这是我的第一个方法

-(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event{
    UITouch *touch = [touches anyObject];
   CGFloat endLocation = [touch locationInView:self];
    CGRect rect = CGRectMake(startLocation.x, startLocation.y, endLocation.x, endLocation.y);
    UIView *rectstring = [[UIView alloc]initWithFrame:rect];
    NSString *string = [NSString stringWithFormat:@"%d",pencilbool];
    [[rectstring layer] setValue:string forKey:@"color"];
    NSString *string1 = [NSString stringWithFormat:@"%f",stepper.value];
    [[rectstring layer] setValue:string1 forKey:@"size234"];

        [array1 addObject:rectstring];
        [rectstring release];
        [string release];
        [string1 release];

}

第二种方法:

 -(IBAction)secondmethod {
        for (UIView *string1 in array1) {
            CGContextRef gc=UIGraphicGetCurrentContext();
            CGFloat width =[[string1.layer valueForKey:@"size234"] floatValue];
            CGContextSetLineWidth (gc, width);
            CGRect rect = [string1 frame];
            CGContextMoveToPoint(gc, rect.origin.x, rect.origin.y);
            CGContextAddLineToPoint(gc, rect.size.width, rect.size.height);
            CGContextStrokePath(gc);
        }
    }

这会导致CGFloat width =[[string1.layer valueForKey:@"size234"] floatValue];. 但是,如果我删除第一种方法中的发布调用:

 [string release];
 [string1 release];

它运行良好。

为什么这会导致错误?有任何想法吗?

4

2 回答 2

0

非 ARC 规则是只释放你保留的东西,显式地或通过调用诸如 alloc 或 copy 之类的东西。(更准确的文档位于:https ://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/MemoryMgmt/Articles/mmRules.html ) stringWithFormat:返回一个自动释放的对象,这意味着你不应该添加另一个释放。

于 2012-07-30T00:39:52.953 回答
0

为什么这会导致错误?

因为您为创建字符串而调用的方法-stringWithFormat:,返回一个自动释放的对象。你没有调用 alloc、retain 或 copy,所以你不应该调用 release。

于 2012-07-30T00:44:24.023 回答