Objective c 在Objective c中使用extern从其他类访问变量是真的吗?

Objective c 在Objective c中使用extern从其他类访问变量是真的吗?,objective-c,extern,Objective C,Extern,我有一个DetailViewController和一个Messages类(这是一个TableViewController类)。我在第一个类中解析一些web信息,并希望在第二个类中使用其中的一些值。当我在这里环顾四周,用谷歌搜索了几个小时,现在我想我需要在我的第二个类中定义一些extern变量,并用第一个类的对象初始化它们。。我尝试了几种方法,但都失败了 在我的第一节课中,我有一个名为messID的NSMutableArray变量,在第二节课中,我这样做: #import DetailViewCo

我有一个DetailViewController和一个Messages类(这是一个TableViewController类)。我在第一个类中解析一些web信息,并希望在第二个类中使用其中的一些值。当我在这里环顾四周,用谷歌搜索了几个小时,现在我想我需要在我的第二个类中定义一些
extern
变量,并用第一个类的对象初始化它们。。我尝试了几种方法,但都失败了

在我的第一节课中,我有一个名为messID的NSMutableArray变量,在第二节课中,我这样做:

#import DetailViewController
.
.
 extern NSMutableArray *myArray;
 DetailViewController *myObject;
myArray=myObject.messID;
但我得到的错误如下:

Undefined symbols for architecture i386:
  "_myArray", referenced from:
      -[messages tableView:cellForRowAtIndexPath:] in messages.o
我做错了什么?我能做什么?有人能帮忙吗

编辑 我已经导入了所需的类, 在第二类的.h文件中,我使用以下内容:

@interface messages : UITableViewController{

       BNT_1DetailViewController *myObject;
}
@property(retain, nonatomic)BNT_1DetailViewController *myObject;
其.m文件为:


我不会使用
extern
,这意味着您也在定义一些全局变量(并试图从使用
extern
关键字的文件中访问它们)。不管怎样,对于记录,您得到的错误取决于这样一个事实:
extern
只是一个不定义对象的指令——它只是按照其他地方的定义声明对象。因此,您应该在一些.m文件中为对象添加适当的定义,而不要忘记在某个时间点对它们进行初始化,以便它们指向有意义的对象

更好的方法是通过在第一个类中声明的公共属性,允许从第二个类访问
NSMutableArray

例如:

@interface DetailViewController : ... {

    NSMutableArray* array;
}
@property (...) NSMutableArray* array;
@end

@interface Messages : ... {
    DetailViewController* detailViewController;
}
...
@end

@implementation Messages;
...
... detailViewController.array...
...
@end
此解决方案更好,因为它不使用全局变量,并且具有更好的封装性

实际上,您可以尝试定义一个包含所有数据的模型(如在模型视图控制器中),并在所有需要它的控制器之间共享这些数据。这将是一个更好的方法

编辑:关于如何将一个控制器连接到另一个控制器

假设您在某个时间创建了一个新控制器:

 messageDetail *detailViewController = [[messageDetail alloc] initWithNibName:@"messageDetail" bundle:nil];
现在,
detailViewController
需要从
消息
中检索其数据,这是创建它的控制器的方式。你有几个选择来做这件事。一个简单的方法是在
messageDetail
中有一个公共属性,该属性链接到
messages

    @interface messageDetail : ... {
        ....
    }
    @property (nonatomic, retain) messages* messagesRef;
    ...
    @end
(不要忘记在
messageDetail
实现中合成此属性)

然后,在实例化
messageDetail
时,只需执行以下操作:

 messageDetail *detailViewController = [[messageDetail alloc] initWithNibName:@"messageDetail" bundle:nil];
 detailViewController.messagesRef = self;
执行此操作后,您的
detailViewController
将有一个正确初始化的指针,指向另一个控制器


如果您的另一个控制器使用NSArray公开(如我上面解释的)一个属性,那么您的操作就完成了。

我不会使用
extern
来完成您尝试执行的操作,这意味着您也在定义一些全局变量(并尝试从使用
extern
关键字的文件中访问它们)。不管怎样,对于记录,您得到的错误取决于这样一个事实:
extern
只是一个不定义对象的指令——它只是按照其他地方的定义声明对象。因此,您应该在一些.m文件中为对象添加适当的定义,而不要忘记在某个时间点对它们进行初始化,以便它们指向有意义的对象

更好的方法是通过在第一个类中声明的公共属性,允许从第二个类访问
NSMutableArray

例如:

@interface DetailViewController : ... {

    NSMutableArray* array;
}
@property (...) NSMutableArray* array;
@end

@interface Messages : ... {
    DetailViewController* detailViewController;
}
...
@end

@implementation Messages;
...
... detailViewController.array...
...
@end
此解决方案更好,因为它不使用全局变量,并且具有更好的封装性

实际上,您可以尝试定义一个包含所有数据的模型(如在模型视图控制器中),并在所有需要它的控制器之间共享这些数据。这将是一个更好的方法

编辑:关于如何将一个控制器连接到另一个控制器

假设您在某个时间创建了一个新控制器:

 messageDetail *detailViewController = [[messageDetail alloc] initWithNibName:@"messageDetail" bundle:nil];
现在,
detailViewController
需要从
消息
中检索其数据,这是创建它的控制器的方式。你有几个选择来做这件事。一个简单的方法是在
messageDetail
中有一个公共属性,该属性链接到
messages

    @interface messageDetail : ... {
        ....
    }
    @property (nonatomic, retain) messages* messagesRef;
    ...
    @end
(不要忘记在
messageDetail
实现中合成此属性)

然后,在实例化
messageDetail
时,只需执行以下操作:

 messageDetail *detailViewController = [[messageDetail alloc] initWithNibName:@"messageDetail" bundle:nil];
 detailViewController.messagesRef = self;
执行此操作后,您的
detailViewController
将有一个正确初始化的指针,指向另一个控制器


如果您的另一个控制器使用NSArray公开(如我上面解释的)属性,则您的操作已完成。

您的意思是不需要外部名称空间?请参阅我的编辑关于
extern
关键字。您不需要它,如果希望DetailController成为全局对象,您可以使用它,但我对此表示怀疑。在任何情况下,您的代码都缺少实际定义
extern
关键字引用的对象的部分。在第一个类中,我使用JSON对象中的一些值初始化数组,我希望在第二个类中使用它们。我试过了,但结果和以前一样我又试了一次,但还是一样。。关于M-V-C模式,你是对的,但我是个新手,在设计和编程方面不太在行。你能在你的问题中解释一下控制器的细节和消息是如何创建的吗?那是什么东西?关键是为messages controller提供指向细节控制器的指针…您的意思是不需要外部名称空间?请参阅我的编辑关于
extern
关键字。您不需要它,如果希望DetailController成为全局对象,您可以使用它,但我对此表示怀疑。在任何情况下,您的代码都缺少实际定义
extern
关键字所引用对象的部分