2010-02-09 72 views
0

我正在研究基于导航的iphone应用程序。当我在堆栈上推新视图控制器时,我想传递一些信息,比如myObject。所以:变量超出视图控制器之间的范围

aViewController *vc = [[aViewController alloc] initwith....]; 
vc.object = myObject //myObject is defined in the current view controller 
[self.navigationController pushViewController:vc]; //vc.object has correct value here 

[vc release] 

aViewController中的对象变量被设置为保留新对象。当我进入新的视图控制器的代码时会发生什么,我发现这个对象被设置为“超出范围”,但我无法得到它,尽管我已经检查过vc.object在视图控制器正在推动。

超出范围错误意味着什么,以及解决此问题的最佳方法是什么?谢谢!

+0

此外,为了澄清,我在这里使用声明的属性,所以在我的aViewController接口中,我有: @property(nonatomic,retain)Object * object; //也sysnthesized – Ying 2010-02-09 17:14:20

+0

什么类是对象?或者你的意思是NSObject? – 2010-02-09 17:21:25

+0

是myObject被声明为保留属性吗? – willcodejavaforfood 2010-02-09 18:42:57

回答

0

好吧,真的很尴尬地宣布我把问题都弄错了。看起来这个对象首先已经超出了范围。 myObject实际上是[myObjectList objectForIndex:index]其中myObjectList是NSMutableArray * myObjectList。这不是一个综合财产。目的是从NSObject的派生的类(@interface对象:NSObject的)

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    for(Object* p in myObjectList) 
    { 
     NSLog(@"%@", p.name); //this returns a garbled message 
    } 
    MyObjectDetailViewController * vc = [[MyObjectDetailViewController alloc] initWithStyle:UITableViewStylePlain]; 
    vc.object = [myObjectList objectAtIndex:indexPath.row]; 
    [self.navigationController pushViewController:vc animated:YES]; //when i hover over "vc" in debugger, it shows that vc.object is defined(i see my name variables) but when i hover over myObjectList in the previous line, the objects say "out of scope" 

    [vc autorelease]; 
} 

要覆盖所有地面,这里是阵列被实例化。这个函数是一个来自sqlite的sqlite3_exec的回调函数。

int callback (void* context, int count, char** values, char** columns) 
{ 
    NSMutableArray *list = (NSMutableArray*)context; 
    Object *obj = [[Object alloc] initWithName:[NSString stringWithUTF8String:values[kName]]]; 
    [list addObject:obj]; 
    [obj release]; 
    NSLog(@"After release"); 
    for(Object *p in list) 
    { 
     NSLog(@"%@", p.name); //this prints out okay 
    } 
    return SQLITE_OK; 
} 

我希望这会让问题更清楚一点。 myObjectList超出范围的事实,但我似乎能够检索其对象是真的很奇怪...

+0

据我所知,这实际上并没有显示数组实例化的位置:有些东西将它作为上下文参数传递给回调函数(并且您正在向其中添加东西),但它是如何实现的呢? – 2010-02-10 16:01:57

+0

我做了,有一个 myObjectList = [[NSMutableArray alloc] init]; [self readObjectListFromDatabase]; //在initWithNibName中调用sqlite3_exec ...请告诉我是否还有其他任何可以帮助描述此问题的内容...我还检查了myObjectList和*上下文的地址(isa)以确保它们是一样的东西。 – Ying 2010-02-10 22:33:56

1

我有一个类似的问题。

在我的情况下,NSMutableArray被声明为类中的私有变量。

当我用同名的公共属性包装变量并添加“自我”。在didSelectRowAtIndexPath中的变量名之前,我的错误消失了。