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

时间:2012-01-25 09:11:11

标签: objective-c extern

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

在我的第一个clas中我有一个名为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文件是:

...

@sysnthesize myObject;


     viewDidLoad{
     myObject=[[BNT_1DetailViewController alloc]init];}
    - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
    {
    #warning Incomplete method implementation.
        // Return the number of rows in the section.
        return myObject.mesID.count;
        }

    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
    {
        static NSString *CellIdentifier = @"Cell";
        //extern NSMutableArray *messID;


        UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
        if (cell == nil) {
            cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
        }NSLog(@" -> %@",myObject.mesID );
           cell.textLabel.text= [myObject.mesID objectAtIndex:indexPath.row];    
            // Configure the cell...
       // [tableView reloadData]; 
        return cell;

        }

1 个答案:

答案 0 :(得分:3)

我不会将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需要从messages检索其数据,这正是创建它的控制器的方式。你有几个选择。一个简单的方法就是在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的一个属性,你就完成了。