使用类方法可以使用ARC导致无限的内存增长吗?

时间:2016-03-01 20:39:56

标签: ios objective-c memory-management automatic-ref-counting

在我的应用程序中,我在实用程序类上有一个类方法,它分配一个新的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];
    }
}

0 个答案:

没有答案