NSArray正在获得EXC_BAD_ACCESS

时间:2011-10-05 19:17:25

标签: iphone ios

我不完全确定我是否首先正确地编写了这个数组。这是我的app委托中的.h。

NSString *text0;
...
NSString *text123;

NSMutableArray *fortunesArray;
}

@property(nonatomic,retain) NSMutableArray *fortunesArray;

@property (nonatomic, retain) IBOutlet UIWindow *window;

@property (nonatomic, retain) IBOutlet AppViewController *viewController;

@end

然后在app delegate.m中,我将所有这些分配给他们。

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    // Override point for customization after application launch.

text0 = @"Text here";
...
text123 = @"Text here";

self.fortunesArray = [NSMutableArray arrayWithObjects:text0,text1,text2,text3,text4,text5,text6,text7,text8,text9,text10,text11,text12,text13,text14,text15,text16,text17,text18,text19,text20,text21,text22,text23,text24,text25,text26,text27,text28,text29,text30,text31,text32,text33,text34,text35,text36,text37,text38,text39,text40,text41,text42,text43,text44,text45,text46,text47,text48,text49,text50,text51,text52,text53,text54,text55,text56,text57,text58,text59,text60,text61,text62,text63,text64,text65,text66,text67,text68,text69,text70,text71,text72,text73,text74,text75,text76,text77,text78,text79,text80,text81,text82,text83,text84,text85,text86,text87,text88,text89,text90,text91,text92,text93,text94,text95,text96,text97,text98,text99,text100,text101,text102,text103,text104,text105,text106,text107,text108,text109,text110,text111,text112,text113,text114,text115,text116,text117,text118,text119,text120,text121,text122,text123,nil];


 self.window.rootViewController = self.viewController;
    [self.window makeKeyAndVisible];
    return YES;
}

我用NSArray和Mutable尝试过这个。 EXC_BAD_ACCESS显示指向text3,然后指向text5。如果我在大约50之后删除所有内容,屏幕将会打开,但是当我最终尝试通过单击按钮让它工作时,它会重新回到那个糟糕的访问状态。 (所以无法判断视图按钮是否存在问题,因为此问题反复出现在此数组中。)我将发布调用它的代码,但我很确定主要问题有待完成用这个数组。

在我看来,controller.m

-(IBAction)ganjaButton:(id)sender{
AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];

int pressCount;
NSString *display;
if(pressCount%2==0){
    [sender setBackgroundImage:[UIImage imageNamed:@"nug2.png"] forState:UIControlStateNormal];
    display = [[NSString alloc] initWithFormat:@"%@",[appDelegate.fortunesArray objectAtIndex:40]];
}
else{
    [sender setBackgroundImage:[UIImage imageNamed:@"nug1.png"] forState:UIControlStateNormal];
    display = [[NSString alloc] initWithFormat:@"%@",[appDelegate.fortunesArray objectAtIndex:44]];
}
pressCount++;

label.text = display;
[display release];

}

在上面的代码中也是如此,说AppDelegate的部分实际上是我的AppDelagtes名称。

任何帮助将不胜感激。感谢。

3 个答案:

答案 0 :(得分:4)

您是否考虑过将所有这些文本值存储在plist中并将其加载到[NSArray arrayWithContentsOfFile:filePath];的数组中?

首先,这将是一个更清洁的解决方案。

编辑:要获取filePath,假设您的plist名为“textStrings.plist”,您将使用以下内容:

NSString *filePath = [bundle pathForResource:@"textStrings" ofType:@"plist"];

答案 1 :(得分:1)

试试这个:

self.fortunesArray = [NSMutableArray arrayWithObjects:text0, text1, text2, nil];

我不知道你是否可以将最大数量的参数传递给某个方法,但是如果有的话,你可能超过124的限制,也可能是50。如果一切正常你只需要将几个对象传递给数组,你应该找到一种不同的方法来创建数组。另一个答案提到使用属性列表,这将是一个很好的解决方案。您还可以使用普通的旧文本文件,在字符串之间使用一些分隔符,将其读入单个字符串,并使用NSString的-componentsSeparatedByString:方法创建数组。

另一方面,如果阵列中只有几个对象仍有问题,那么你就会知道问题出在其他地方。我没有看到任何明显的问题,但我会留意代码中设置fortunesArray属性的其他地方。

答案 2 :(得分:0)

我认为阵列正在自动释放,这就是崩溃出现的原因。尝试为阵列分配内存

self.fortunesArray = [[NSMutableArray alloc] initWithObjects:text0,text1 ... text123,nil];

并在完成后释放阵列。但我强烈建议使用克里斯托弗建议的plist文件。