2011-05-12 108 views
2

我是非常新的Objective-C和即时尝试声明在XCode UITableView的新实例。这里是我的代码:客观c类实例声明错误?

UITableView *mainTable = [[UITableView alloc] init]; 

和Xcode是在=指着困扰着我约在声明语句,这显然是有结束分号。

编辑:

#import <UIKit/UIKit.h> 

@interface TestRunAppDelegate : NSObject <UIApplicationDelegate> { 

    UITableView *mainTable = [[UITableView alloc] init]; 

} 
+1

你可以粘贴五行或六行左右的行吗? – BoltClock 2011-05-12 00:42:29

回答

4

您不能在class's interface内进行分配。

移动分配新建分配FY到应用程序委托的init方法:

#import <UIKit/UIKit.h> 

@interface TestRunAppDelegate : NSObject <UIApplicationDelegate> { 

    UITableView *mainTable; 

} 
@end 

@implementation TestRunAppDelegate 

- (id)init { 

    if(!(self = [super init])){ 
     return nil; 

    mainTable = [[UITableView alloc] init]; 

    return self; 
} 
@end 

@interface块(一切从@interface@end)只是告诉其他代码从你的类会发生什么。它不是任何东西本身。在花括号之间,你声明了实例变量,但实际上并没有创建任何对象。在实例变量声明之后并在@end之前,您声明您的方法。再一次,你没有实现它们。你只是让编译器和任何其他代码导入你的头文件,知道他们可以指望你的类做什么。

以这种方式分离实现和接口的原因是实现了面向对象编程的一个原则。一个对象本质上告诉其他对象它可以做什么(接口),但是并没有声明它将完成一个任务(实现)。


*他们通常被放入两个独立的文件,但实际上并不是。

4

你试图实例化实例变量@interface。您必须在@implementation块中执行此操作。

+0

将声明移至@implementation。同样的错误。 – nkcmr 2011-05-12 00:55:35

+0

@sightofnick:不是_declaration_。您需要在@interface中_declare_和@implementation中的_assign_。看到我的扩展答案。 – 2011-05-12 01:02:45

4

您只能在@implementation的方法内为变量指定一个值。 @interface中的声明基本上是“正视”系统。

附录:@interface的东西,实际上并没有做任何;它只是编译器知道要查找什么的一个指示,Interface Builder的一些钩子以及您的类所做的公开声明。重要的部分是@implementation - 但即使如此,在编译器指令(如@synthesize)之外,只有方法内的东西才算数。 Objective-C不是程序性的;它不会按顺序执行每一行。编译器指令(如@synthesize)由编译器进行分析和处理,编译器在@synthesize的情况下创建新方法,并预处理器指令(例如#define)在运行系统看到它们之前再次处理。运行时系统只能执行代码块 - 你的方法;它没有你整个@implementation的意义,只有这个类的方法。运行时系统不知道该类以外的任何内容,因此它不是有效的代码。这就是为什么你必须在你的实现中的方法内部进行赋值。

+0

这是为什么被拒绝?对我来说,这似乎是一个完全合理的答案 – nielsbot 2011-05-12 01:02:35

+0

@neilsbot:这与其他两个答案完全相同,差不多10分钟后。 – 2011-05-12 01:04:42

+0

意思是发布附录,但在粘贴之前点击发布按钮(使用语音识别和复制/粘贴)。 – FeifanZ 2011-05-12 01:08:26