如何在ViewControllers中初始化自定义类?

时间:2011-03-29 02:42:53

标签: iphone objective-c

我仍然试图围绕如何在多个ViewControllers中最好地创建和初始化自定义类。

  • 假设我创建了一个MyData类。

  • 在FirstViewController中,我希望初始化它。

  • 在大学的某个iPhone课程中,教师建议使用以下内容,以便不会创建同一对象的多个实例。

    @property and @synthesize myData is done
    
    -(MyData *)myData { 
        if (!myData) {
            myData = [[MyData alloc] init]; 
        }
        return myData; 
    }
    
    myData is released
    
  • 有三件事。如果我在其中一个FirstViewController的方法中放置一个MyData alloc init,那么每次调用该方法时都会告诉我,会创建一个消耗内存并且可能导致内存泄漏的新对象。通过创建上面的getter,每次使用该对象时,都会调用getter,这似乎浪费了CPU周期。如果我不执行alloc init,则根本不会创建该对象。

  • 最后在后续的视图中,我发现只需在SecondViewController中执行@property和@synthesize MyData,然后将FirstViewController中的myData对象传递给它。

那么为什么我需要alloc init来创建FirstVC中的对象而不是SecondVC中的对象?我不应该这样做,为要创建的对象分配一些内存,以便我可以发送引用吗?

在FirstVC中有没有更好的方法来分配初始化对象myData,它不会创建多个实例,但不会浪费CPU周期? (对于那些认为CPU很便宜的人来说,如果你宣布了许多对象并想到移动设备会怎么样)

希望这是有道理的。提前谢谢,

西仁。

1 个答案:

答案 0 :(得分:1)

我不确定我是否能完全解决你的困惑,但这里有一些想法要考虑:

首先,不要担心与使用属性访问器相关的CPU负载。如果这是你的瓶颈所在,要么你做得很好,要么你的应用程序做得不够。很清楚潜在的性能问题;在你知道确实存在问题之前修复它们并不是那么好。

其次,为什么不在-initWithNibName:bundle:方法中初始化属性?像这样:

-(id)initWithNibName:(NSString*)name bundle:(NSString*)bundle
{
    if (self = [super initWithNibName:name bundle:bundle]) {
        myData = [[MyData alloc] init];
    }
    return self;
}

您展示的代码看起来有点像创建单例的代码,即只能实例化一次的类。那可能是你老师在说什么吗?这不是你大部分时间都需要做的事情。

我不确定如何用第二个视图控制器解决你的问题...我认为那里有一些混乱,因为我们没有任何代码可以讨论,所以很难继续。如果您正在使用“现代”Objective-C运行时,您可以声明属性而不提供匹配的实例变量,也许这就是您正在做的事情,但您仍然需要在使用它们之前初始化属性。