obj c类内存管理

时间:2013-06-14 07:42:32

标签: objective-c memory-management

我已经扩展了UIView以实现一些独特的功能。除此之外,我还将几个对象作为属性包含在内,并在初始化程序中将它们定义为默认值。这意味着扩展此类Graphics.m的每个对象都将实例化这些对象,并且可以使用默认接口颜色等。

我的问题是,如果我有大量的对象,我会在每个对象中实例化这些默认值(它们可能在某些对象中未使用)会严重影响应用程序的性能吗?

我正在运行最新版本的Xcode和iOS。

感谢阅读。

1 个答案:

答案 0 :(得分:1)

  

如果我有大量的对象,我会在每个对象中实例化这些默认值(它们可能在某些对象中未使用)会严重影响应用程序的性能吗?

这取决于这些属性的大小以及框架是否在内部缓存实例。

在您的情况下,您可以做的是将默认值保留在具有静态存储持续时间的变量中,并在初始化实例时将属性指向这些变量。在这种情况下,如果在初始化之后这些属性没有改变,那么它们都指向相同的对象。例如:

// ARKGraphicsView.m

static UIColor *_ARKGraphicsViewDefaultForegroundColour = nil;
static UIColor *_ARKGraphicsViewDefaultBackgroundColour = nil;
static UIColor *_ARKGraphicsViewDefaultBorderColour = nil;

@implementation ARKGraphicsView

+ (void)initialize {
    if (self == [ARKGraphicsView class]) {
        // This code is executed only once,
        // when the class receives its first message
        _ARKGraphicsViewDefaultForegroundColour = [UIColor …];
        _ARKGraphicsViewDefaultBackgroundColour = [UIColor …];
        _ARKGraphicsViewDefaultBorderColour = [UIColor …];
    }
}

- (id)initWith… {
    self = [super initWith…];
    if (self) {
        _foregroundColour = _ARKGraphicsViewDefaultForegroundColour;
        _backgroundColour = _ARKGraphicsViewDefaultBackgroundColour;
        _borderColour = _ARKGraphicsViewDefaultBorderColour;
    }
    return self;
}

…

@end

如果程序创建了此类的100个实例且这些实例没有更改颜色,则只有三个UIColor个实例 - 保存在_ARK*Colour变量中的实例。