所以我正在开发一个应用程序,而且我没有使用自动引用计数,因此我必须自己进行内存管理。我有这个代码,它在第一个方法中为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];
运行良好。
为什么会导致错误?有什么想法吗?
答案 0 :(得分:0)
非ARC规则只是显式地或通过调用alloc或copy这样的东西来释放你保留的东西。 (更准确的文档位于:https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/MemoryMgmt/Articles/mmRules.html)stringWithFormat:
返回一个自动释放的对象,这意味着您不应该添加另一个版本。
答案 1 :(得分:0)
为什么会导致错误?
因为您调用的方法是创建字符串-stringWithFormat:
,所以返回一个自动释放的对象。你没有调用alloc,retain或copy,所以你不应该调用release。