我正在使用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文件中。那么应该在哪里制作类实例呢?
我打赌我错过了一些明显的东西。提前谢谢。
答案 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在评论中所述,该案件有详细解释。但是为了改善答案我根据那个链接改变了。