Iphone 为UILabel赋值时模拟器崩溃
我有一段代码,由于某种原因,每当我试图更改标签的文本时,它都会崩溃Iphone 为UILabel赋值时模拟器崩溃,iphone,ios,cocoa-touch,Iphone,Ios,Cocoa Touch,我有一段代码,由于某种原因,每当我试图更改标签的文本时,它都会崩溃 - (void) viewDidLoad { [super viewDidLoad]; NSString * path = [[NSBundle mainBundle] pathForResource:@"Subs" ofType:@"plist"]; NSMutableDictionary * modelDict = [NSMutableDictionary dictionaryWithContents
- (void) viewDidLoad {
[super viewDidLoad];
NSString * path = [[NSBundle mainBundle] pathForResource:@"Subs" ofType:@"plist"];
NSMutableDictionary * modelDict = [NSMutableDictionary dictionaryWithContentsOfFile:path];
NSDictionary * yearDict = [modelDict valueForKey:Sub_Model];
for (NSString * yearKey in yearDict) {
NSDictionary * sizeDict = [yearDict valueForKey:yearKey];
mount_depth = round([[[sizeDict valueForKey:Sub_Size] objectForKey:@"Mounting Depth"] floatValue]);
displacement = round([[[sizeDict valueForKey:Sub_Size] objectForKey:@"Displacement"] floatValue]);
sealed_min = [[[sizeDict valueForKey:Sub_Size] objectForKey:@"Sealed Min."] floatValue];
sealed_max = [[[sizeDict valueForKey:Sub_Size] objectForKey:@"Sealed Max."] floatValue];
ported_min = [[[sizeDict valueForKey:Sub_Size] objectForKey:@"Ported Min."] floatValue];
ported_max = [[[sizeDict valueForKey:Sub_Size] objectForKey:@"Ported Max."] floatValue];
minportlen = [[sizeDict valueForKey:Sub_Size] objectForKey:@"Min. Port Len."];
maxportlen = [[sizeDict valueForKey:Sub_Size] objectForKey:@"Max. Port Len."];
}
// [self loadEnclosure];
portlenLbl.hidden = FALSE;
}
然后,我在导航项上有一个分段控件,可以根据用户选择的内容更改标签,并且每当用户选择非默认标签时,程序就会崩溃
- (IBAction) boxSize:(id)sender {
// [self loadEnclosure];
switch (self.boxControl.selectedSegmentIndex) {
case 0:
portlenLbl.text = (@"%@", minportlen);
break;
case 1:
portlenLbl.text = (@"%@", maxportlen);
break;
default:
break;
}
}
我还应该补充一点,在达到这一点之前,有多个视图,它们是使用类似以下方法调用的:
- (IBAction) GetBox:(id)sender {
K_Box * KView = [[K_Box alloc] initWithNibName:nil bundle:nil];
KView.Num_Subs = self.Num_Subs;
KView.Box_Type = self.Box_Type;
KView.Box_Shape = self.Box_Shape;
KView.Sub_Model = self.Sub_Model;
KView.Sub_Size = self.Sub_Size;
[self presentModalViewController:KView animated:YES];
}
你真正的问题在这里:
minportlen = [[sizeDict valueForKey:Sub_Size] objectForKey:@"Min. Port Len."];
maxportlen = [[sizeDict valueForKey:Sub_Size] objectForKey:@"Max. Port Len."];
objectForKey:
返回一个自动删除的对象,您直接将其分配给实例变量。当您的应用程序到达boxSize:
方法时,这些值已超出范围,因为它们已从管理它们的自动释放池中排出。因此,解决方案是简单地保留objectForKey:
的返回值,然后直接将其分配给实例变量:
minportlen = [[[sizeDict valueForKey:Sub_Size] objectForKey:@"Min. Port Len."] retain];
maxportlen = [[[sizeDict valueForKey:Sub_Size] objectForKey:@"Max. Port Len."] retain];
(当然,如果您将实例变量定义为属性,则应使用指定的属性设置程序。)只需使用portlenLbl.text=[[NSString stringWithFormat:@“%@”,maxportlen]。
请记住,无论何时设置标签文本,都要使用上述语法。arr没有足够的信誉来编辑文章。请使用代码标记,并将其对齐得更准确一点。//编辑:谢谢@Abitobvious是的,当你发布时我正在编辑它,因为我看到它很时髦。对不起。你意识到了吗,有一个实时预览?我当时正在编辑当你们在编辑的时候,ng:)对不起,这太有趣了,三四个人在编辑同一篇文章:'Dor[NSString stringWithFormat:@“%@”,maxportlen];如果他喜欢采用一种格式,)//是的,我知道,我只是为了完整性而评论一些帖子^p@iPortable是的,但OP似乎不想这样做。最初涉及的文本更多,但我删除了它以进行调试。这样做仍然会崩溃。当我在头文件中声明minportlen和maxportlen时,我将它们设置为@property(非原子,保留)这与上面的相同吗?@Ian Oswald您正在执行直接实例变量赋值,这对赋值没有任何影响,因此您可以使用我的解决方案,也可以通过self
使用属性设置器。使用此赋值仍有相同的问题。使用stringWithFormat:@“%@”
对于已经是NSString的对象来说,这是不必要的开销——没有格式,那么为什么要让设备计算格式字符串呢?