我非常对objective-c是新的,我试图在XCode中声明UITableView
的新实例。这是我的代码:
UITableView *mainTable = [[UITableView alloc] init];
并且XCode指向=
并且在声明语句的末尾困扰我一个分号,这显然就在那里。
修改
#import <UIKit/UIKit.h>
@interface TestRunAppDelegate : NSObject <UIApplicationDelegate> {
UITableView *mainTable = [[UITableView alloc] init];
}
答案 0 :(得分:4)
您正尝试在@interface中实例化实例变量。您必须在@implementation块中执行此操作。
答案 1 :(得分:4)
您无法在class's interface内进行作业。
将分配移动到您的app委托的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
之前,您声明了您的方法。同样,你没有实现它们。您只需让编译器以及导入标题的任何其他代码知道您的课程可以做什么。
以这种方式分离实现和接口的原因*是实现面向对象编程的原则之一。一个对象本质上告诉其他对象它可以做什么(接口),但没有声明 它将如何完成任务(实现)。
*它们通常放在两个单独的文件中,但实际上并没有 。
答案 2 :(得分:4)
您只能为@implementation
中的方法中的变量分配值。 @interface
中的声明基本上是系统的“抬头”。
附录: @interface
中的内容实际上并不是做任何内容;它只是编译器知道要查找内容的指令,Interface Builder的一些钩子,以及类的功能的公共声明。重要的部分是@implementation
- 但即使这样,在编译器指令之外,例如@synthesize
,只有方法内的东西才算数。 Objective-C不是程序性的;它不会按顺序执行每一行。诸如@synthesize
之类的编译器指令由编译器解析和处理,编译器在@synthesize
的情况下创建新方法,以及预处理器指令,例如#define
,它们在运行时系统之前再次处理永远看到他们。运行时系统只能执行代码块 - 您的方法;它没有你整个@implementation
的感觉,只有班级的方法。运行时系统不知道类外的任何内容,因此它不是有效的代码。这就是为什么你必须在实现中的方法中进行赋值。