2010-02-09 74 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中的變量名之前,我的錯誤消失了。