2011-10-09 20 views
1

我是新來的Objective C,我真的可以使用一些幫助。添加到數組的對象立即超出範圍

我創建了一個名爲Agent的類。代理類包含以下方法:

+ (Agent *)agentWithName:(NSString*)theName { 

     Agent *agent = [[[Agent alloc] init] autorelease]; 

     agent.agentName = theName; 
     return agent; 
    } 

然後從我的根視圖控制器我通過名稱創建每個名稱的代理對象和添加的詞典要循環,代理對象一個NSMutableArray:

for (id object in dictArray) { 
     NSString *agentName = [object objectForKey:@"name"]; 
     [self.myAgents addObject:[Agent agentWithName:agentName]]; 
    } 

問題是隻要執行已經通過[self.myAgents addObject:[Agent agentWithName:agentName]];,NSMutableArray self.myAgents內部的所有代理對象都被調試器列爲「超出範圍」。當我嘗試訪問該數組中的對象時,這會在我的代碼中稍後導致EXC_BAD_ACCESS。對象被添加到數組中(至少它們在XCode調試器中顯示),它們剛剛超出範圍,但在退出for循環之前它們超出了範圍。任何人都可以請解釋我做錯了什麼?我幾乎可以肯定,這與我對內存管理缺乏理解有關。謝謝參觀。

+4

你一定了解因果關係嗎? gdb有時非常愚蠢,並且說當事實並非如此時,某些事情是超出範圍的。但是我懷疑調試器的輸出是「當我嘗試訪問該數組中的對象時,這會在我的代碼中導致EXC_BAD_ACCESS」的原因。 –

+1

同意Ole。您目前發佈的代碼似乎沒有任何問題。我們能否看到「myAgents」變量的聲明和任何賦值?我懷疑這是不好的訪問。 – bobDevil

+0

「超出範圍」與它完全無關。一個對象不能超出範圍,因爲對象沒有範圍。變量具有範圍,但變量不控制對象的生命週期。所以你看錯了地方。 「超出範圍」錯誤只是調試器中的一個缺陷。 – Chuck

回答

0

我就已經創建了一個簡單的NSObject類的代理:

// Agent.h 

@interface Agent : NSObject 

@property (nonatomic, copy) NSString *agentName; 

- (id)initWithAgentName:(NSString *)name; 

@end 

// Agent.m 

@implementation Agent 

- (id)initWithAgentName:(NSString *)name 
{ 
    self = [super init]; 
    if (self) { 
     // Custom initialization 

     self.agentName = name; 
    } 
    return self; 
} 

,然後創建實例:

// Assuming dictArray contains NSDictionaries like your code implies 
for (id dictionary in dictArray) 
{ 
    NSString *agentName = [dictionary objectForKey:@"name"]; 
    Agent *agent = [[Agent alloc] initWithAgentName:agentName]; 
    [self.myAgents addObject:agent]; 
}