【问题标题】:objective c class instance declaration error?目标c类实例声明错误?
【发布时间】:2011-08-23 17:59:02
【问题描述】:

非常是objective-c 的新手,我试图在XCode 中声明UITableView 的新实例。这是我的代码:

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

XCode 指向 =,并在声明语句末尾的分号困扰我,这显然是存在的。

编辑:

#import <UIKit/UIKit.h>

@interface TestRunAppDelegate : NSObject <UIApplicationDelegate> {

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

}

【问题讨论】:

  • 你能在这条线周围粘贴五六行左右吗?

标签: iphone objective-c class instance declaration


【解决方案1】:

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

将分配移动到您的应用委托的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】:

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

    【讨论】:

    • @sightofnick:不是声明。您需要在@interface 中declare,并在@implementation 中assign。请参阅我的扩展答案。
    【解决方案3】:

    您只能为@implementation方法内的变量赋值。 @interface 中的声明基本上是对系统的“提醒”。

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

    【讨论】:

    • 为什么这被否决了?对我来说似乎是一个完全合理的答案
    • @neilsbot:几乎 10 分钟后,它说的与其他两个答案完全相同。
    • 打算发布附录,但在我粘贴之前点击了发布按钮(使用语音识别和复制/粘贴)。
    猜你喜欢
    • 2018-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-10
    • 1970-01-01
    • 2014-09-08
    相关资源
    最近更新 更多