在我的应用程序中,我在实用程序类上有一个类方法,它分配一个新的UILabel并返回它:
+ (UILabel *)createLbl:(CGRect)lblRect boldFont:(BOOL)boldFont lblTxtColor:(UIColor *)txtColor lblFontSize:(float)fontSize {
UILabel *label = [[UILabel alloc] init];
label.frame = lblRect;
label.backgroundColor = [UIColor clearColor];
label.font = boldFont
? [GlobalUtility getDefaulBoldFontForSize:fontSize]
: [GlobalUtility getDefaulFontForSize:fontSize];
label.textColor = [txtColor copy];
label.textAlignment = NSTextAlignmentCenter;
label.lineBreakMode = NSLineBreakByWordWrapping;
label.numberOfLines = 0;
return label;
}
+ (UIFont*)getDefaulBoldFontForSize:(float)size {
@autoreleasepool {
return [UIFont fontWithName:NSLocalizedString(@"Lato-Bold", nil) size:size];
}
}
+ (UIFont*)getDefaulFontForSize:(float)size {
@autoreleasepool {
return [UIFont fontWithName:NSLocalizedString(@"Lato-Regular", nil) size:size];
}
}
我用仪器中的分配来描述我的应用程序,每当调用createLbl:boldFont:lblTxtColor
时,我们都会获得无限的内存增长。它几乎就像是一个类方法一样,它为事物增加了额外的保留计数。我尝试将其包裹在@autoreleasepool
中以使其无效。
我们在class方法中分配了一个字符串或类似的东西,还有很多其他的类方法,在这种情况下我们也看到了这种增长。
有没有理由为什么在类方法中分配会导致无限制的增长?该类是否在示例中保留对分配的UILabel的引用?
编辑:下面是我们称之为的代码示例。它会更新导航栏上的状态指示器。
- (void)showIndicatorWithNotification:(NSNotification*)notification {
/* show a little number with how many sync items remain in the current sync cycle */
NSString *bundleID = [GlobalUtility getAppBundleID];
NSString *text = [NSString stringWithFormat:@"%i",[notification.object intValue]];
if ([bundleID isEqualToString:BETA_BUNDLEID]) {
UILabel *syncCount;
/* Re-use the existing label if it exists */
NSArray *subviews = self.navigationItem.rightBarButtonItem.customView.subviews;
for(UIView *view in subviews) {
if([view isKindOfClass:[UILabel class]]) {
if(view.tag == 66) {
syncCount = (UILabel *)view;
}
}
}
/* Otherwise create it */
if(syncCount == nil) {
syncCount = [PDXControl createLbl:CGRectMake(60, 40-15, 15, 15) boldFont:NO lblTxtColor:[UIColor whiteColor] lblFontSize:10.0f];
syncCount.tag = 66;
[self.navigationItem.rightBarButtonItem.customView addSubview:syncCount];
}
syncCount.text = text;
[self.navigationItem.rightBarButtonItem.customView setNeedsDisplay];
}
}