【问题标题】:iPhone function to create UILabel fails and crashesiPhone创建UILabel的功能失败并崩溃
【发布时间】:2010-09-07 16:31:48
【问题描述】:

我有一个带有滚动视图的视图。我使用代码向滚动视图添加标签。由于有很多冗余代码,我尝试将标签创建移动到返回 UILabel 的单独函数中。这是那个函数:

- (UILabel *)   f_MakeLabelWithL:(float)MyLeft T:(float)MyTop W:(float)MyWidth H:(float)MyHeight Align:(UITextAlignment)MyAlign 
                      Font:(UIFont *)MyFont TextColor:(UIColor *)MyTextColor BGColor:(UIColor *)MyBGColor {

CGRect rect = CGRectMake(MyLeft, MyTop, MyWidth, MyHeight);
UILabel *label = [[[UILabel alloc] initWithFrame:rect] autorelease];

label.adjustsFontSizeToFitWidth = YES;
label.backgroundColor = MyBGColor;
label.font = MyFont;
label.numberOfLines = 0;
label.textAlignment = MyAlign;
label.textColor = MyTextColor;

return label;
}

我在返回后设置标签的文本。或者我是这么打算的。事实上,被告知具有蓝色背景的标签显示为纯黑色矩形。一个有明确背景的人是完全清楚的。更糟糕的是:scrollview 不会滚动,并且试图让它这样做会使应用程序崩溃,而调试器控制台中没有任何解释。

然而,所有这些代码都可以很好地内联。

有人知道为什么吗?

更新:将代码内联修复了标签的显示。但我也在使用一个函数来创建图像:

- (UIImageView *) f_MakeImageWithL:(float)MyLeft T:(float)MyTop W:(float)MyWidth H:(float)MyHeight File:(NSString *)MyFile {
CGRect rect = CGRectMake(MyLeft, MyTop, MyWidth, MyHeight);
UIImageView *oImageView = [[[UIImageView alloc] initWithFrame:rect] autorelease];

NSString *s = [[Isystant f_DocumentsPath] stringByAppendingPathComponent:MyFile];
UIImage *oImage = [UIImage imageWithContentsOfFile:s];
[oImageView setImage:oImage];
oImageView.backgroundColor = [UIColor redColor];
oImageView.opaque = YES; // explicitly opaque for performance

return oImageView;
}

它正在创建图像,但直到我将这段代码也重新内联后,冻结的滚动/崩溃问题才消失。

【问题讨论】:

    标签: iphone crash uilabel


    【解决方案1】:

    在我看来,您过度释放了 UILabel。如果在此之前从未保留过标签(并且您已在 makeImageWithL 方法中自动释放它),则您不必在将标签添加到滚动视图后释放它。

    这可能就是当你把它内联时它工作的原因......因为在那种情况下,我敢打赌你正在删除自动释放,对吧?

    -S

    【讨论】:

    • 没错!我忘记了当我从一个函数中获得一个控件时,我不需要释放它。你不分配初始化,你不释放!我的线索应该是在调试器控制台中没有任何解释的崩溃。当问题过度释放时,这似乎总是会发生。非常感谢。 (为了清楚起见:有效的是自动释放函数中的控件,而不是释放作为函数接收者的对象变量。)
    【解决方案2】:

    您是否将退回的标签保留在某处?

    【讨论】:

    • 尝试不使用自动释放,也尝试在返回之前将 text 属性设置为某个值,看看是否有帮助。
    • 我不保留标签。一旦我将它添加到滚动视图的子视图中,我就会释放它。关于自动释放,创建和返回标签的函数必须自动释放它。一旦函数返回标签,如果它不自动释放它就没有办法释放它,因此它会泄漏内存。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-17
    • 1970-01-01
    • 2023-04-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多