Objective-C - 声明类实例的位置?

时间:2016-02-03 21:27:57

标签: ios objective-c

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

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

我想在第一个ViewController加载时创建一个Cube实例,但是当我在那里加载时,没有其他方法可以访问它。

我是Obj-C的新手,但据我所知,Viewcontroller.m中不应该包含main方法,因为这是在main.m文件中。那么应该在哪里制作类实例呢?

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

4 个答案:

答案 0 :(得分:2)

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

根本不需要它在@interface,因为这会将你的班级内部工作暴露给其他班级。 See this amazingly detailed answer for more info.

ivar使用示例:

@implementation YourViewController {
    Cube *cube;
}

然后,您可以从viewDidLoad

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

可以在全班同学中自由访问:

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

由于以下几个原因,我更喜欢ivars而不是属性(内部变量):

  • 如果您没有使用任何吸气剂或固定剂,如果您不打算使用它,为什么要在ivar上覆盖额外的一层? (所有属性都在当天结束时。)

  • 在课堂上使用它们会更加清晰(cube而不是self.cube)。

  • 他们定义起来要快得多。

  • 他们更容易与外部属性区分开来(我喜欢将外部值和内部值分开)。

  • 他们的速度更快。好的,几纳秒,但每一点都很重要。

虽然,值得注意的是某些情况下属性优于ivars(内部存储):

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

  • 如果你想使用内部的getter和setter(我从来不需要这样做,但如果你愿意的话,那就在那里)。

  • 如果你想使用KVO(虽然我内心从未需要这样做)。

在一天结束时,它仍然是一个偏好的问题。我知道在我发表的一些评论中声称ivars比属性更好时,我可能有点过于大肆宣传。

答案 1 :(得分:2)

我会在你的.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应如何处理对象。

答案 2 :(得分:1)

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

首先将Cube声明为类属性变量。 (在您的.m文件中)

@property Cube *cube;

然后像这样覆盖多维数据集的getter方法

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

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

[self.cube anyMethodOfCube];

答案 3 :(得分:0)

在界面中将对象定义为:

@implementation YourViewController
{
  Cube *cube;
}

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

中初始化
cube = [[Cube alloc] init];

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

修改 正如originaluser2在评论中所述,该案件有详细解释。但是为了改善答案我根据那个链接改变了。