Iphone 视图控制器之间的变量超出范围

Iphone 视图控制器之间的变量超出范围,iphone,objective-c,Iphone,Objective C,我正在开发一款基于导航的iphone应用程序。当我在堆栈上推一个新的视图控制器时,我想传递一些信息,比如myObject。因此: aViewController *vc = [[aViewController alloc] initwith....]; vc.object = myObject //myObject is defined in the current view controller [self.navigationController pushViewController:vc]

我正在开发一款基于导航的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在推送视图控制器时是否有效


超出范围的错误是什么意思?解决这个问题的最佳方法是什么?谢谢

好吧,我很尴尬地宣布我把问题搞错了。首先,似乎该对象已超出范围。myObject实际上是[myObjectList objectForIndex:index],其中myObjectList是NSMutableArray*myObjectList。这不是合成属性。对象是从NSObject派生的类(@interface Object:NSObject)

为了涵盖所有方面,这里是数组实例化的地方。此函数是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超出了范围,但我似乎能够检索它的对象,这一事实真的很奇怪…

我也遇到了类似的问题

在我的例子中,NSMutableArray被声明为类中的私有变量


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

同样为了澄清,我在这里使用声明的属性,因此在我的aViewController界面中,我有:@property(nonatomic,retain)Object*Object//还有sysnthesizedObject是什么类???还是说NSObject?myObject是否也声明为保留属性?是否碰巧实现了setObject方法?这样做将覆盖您的合成属性,而不会保留任何内容。发布实际代码可能会有所帮助。据我所知,这并没有实际显示数组的实例化位置:有东西将其作为上下文参数传递给回调(您正在向其中添加内容),但它是如何到达的?我知道了,有一个myObjectList=[[NSMutableArray alloc]init];[self-readObjectListFromDatabase]//它在initWithNibName中调用sqlite3_exec…请告诉我是否还有其他东西可以帮助描述此问题…我还检查了myObjectList的地址(isa)和*上下文,以确保它们是相同的东西。
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;
}