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在评论中表示,这里有一个详细的解释。 但为了改善我根据这个链接改变的答案。