2011-03-29 47 views
0

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

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

  • 在FirstViewController中,我想初始化它。

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

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

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

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

有没有更好的方式来分配初始化对象MyData在FirstVC中不创建多个实例,但不会不必要地浪费CPU周期? (对于那些认为CPU很便宜的公司,如果你有很多对象声明并认为是移动的)

希望这是有道理的。在此先感谢,

Hiren。

回答

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运行时,则可以在不提供匹配的实例变量的情况下声明属性,也许这就是您正在做的事情,但在使用它们之前仍需要初始化属性。

+0

嗯......有趣。我没有想到这一点。 – HM1 2011-03-29 06:19:11