Objective-C – 类实例在哪里声明?

我使用Objective-C(Xcode)编写程序,我需要能够创build另一个类的实例。

- (void)viewDidLoad { [super viewDidLoad]; currentSide = 0; [self loadStage]; Cube *cube = [[Cube alloc] init]; } 

我想在第一个ViewController加载的时候立即创build一个Cube实例,但是当我创build它时,没有其他方法可以访问它。

我是Obj-C的新手,但据我了解,Viewcontroller.m不应该有一个主要的方法,因为这是在main.m文件。 那么应该在哪里创build类实例呢?

我敢打赌我错过了一些明显的东西。 提前致谢。

我会这样做,在你的.m文件中:

  @interface YourClass () @property(nonatomic, strong) Cube cube; @end @implementation YourClass - (void)viewDidLoad { [super viewDidLoad]; currentSide = 0; [self loadStage]; self.cube = [[Cube alloc] init]; } @end 

您不必使用@property语法,但它是标准惯例,使您的代码更易于阅读,如果您需要,可以稍后再获取getter或setter,并且可以轻松地指定ARC如何处理物体。

如果你只是想要一个简单的伊娃,而不是一个属性,你只需要在你的@implementation { ... }定义它。

没有必要将它放在@interface因为这会将类的内部运作暴露给其他类。 看到这个惊人的详细的答案更多的信息。

伊娃使用的例子:

 @implementation YourViewController { Cube *cube; } 

你可以从你的viewDidLoad加载它:

 - (void)viewDidLoad { [super viewDidLoad]; currentSide = 0; [self loadStage]; cube = [[Cube alloc] init]; } 

并且可以在整个class级中自由访问:

 -(void) foo { cube.bar = @"baz"; } 

我更喜欢ivars比这个(内部variables)的属性有以下几个原因:

  • 如果你不使用任何getter或setter,为什么要叠加一个额外的层,如果你不打算使用它? (这是所有的属性是在一天结束)。

  • 他们在你的class级( cube而不是self.cube )使用更清洁。

  • 他们更快定义。

  • 他们更容易区分外部属性(我喜欢保持外部价值和内部价值分离)。

  • 他们更快。 好吧, 只有几个纳秒,但每一个小数。

尽pipe在某些情况下值得注意的是属性比ivars更好(用于内部存储)

  • 如果你想使你的代码线程安全,你应该使用atomic属性,以确保读写正确序列化。

  • 如果你想使用内部的getters和setters(我从来没有需要这样做,但它是在那里,如果你想)。

  • 如果你想使用KVO(虽然,我再也不需要这个内部)。

在一天结束的时候,这仍然是一个偏好问题。 我知道,我可能有点过分强调,在我提出的一些评论中,艾瓦尔比我的属性更好。

你可以做一个懒惰的初始化。

首先将Cube声明为一个类属性variables。 (在你的.m文件中)

 @property Cube *cube; 

然后重写像这样的立方体的getter方法

 - (Cube *)cube { if(!_cube) { _cube = [[Cube alloc] init]; } return _cube; } 

然后在你的class级的任何方法中使用该对象

 [self.cube anyMethodOfCube]; 

在界面中定义你的对象为:

 @implementation YourViewController { Cube *cube; } 

并在第一次使用或直接在viewDidLoad初始化:

 cube = [[Cube alloc] init]; -(void)someOtherMethodInViewController { [cube cubeMethod];//now it is reachable } 

编辑为originaluser2在评论中表示,这里有一个详细的解释。 但为了改善我根据这个链接改变的答案。