【问题标题】:Not sure why I have "EXC Bad Access" error不知道为什么我有“EXC Bad Access”错误
【发布时间】:2010-10-19 21:59:22
【问题描述】:

我已经使用 Java 和 .Net 编程了一段时间,但从未真正使用过 C 或 Objective C。我仍在尝试理解一些概念。我正在研究一个简单的程序,只是为了看看我如何制作一个结构数组。我相信我是对的。我很难弄清楚如何访问子类并将值存储到我创建的子类中。

我猜我收到错误是因为我使用了 scanf。任何人都可以提供任何帮助吗?

这是我目前所拥有的。

#import <Foundation/Foundation.h>

//Player Prototype: Stores name and wins so far. It can also print out the name and wins
@interface Player : NSObject
{
    NSString *name; //Player name
    NSInteger wins; //Player wins
    NSInteger losses; //Player losses
    NSInteger bp; //extra value for anything I might need in the future.
}

@property (retain, nonatomic) NSString *name;
@property NSInteger wins;
@property NSInteger losses;
@property NSInteger bp;

@end

//Next part

@implementation Player

@synthesize name;
@synthesize wins;
@synthesize losses;
@synthesize bp;

@end

//Brackets

@interface Bracket : NSObject
{
    NSMutableArray *playerarray;
    Player *addplayer;
}

@property (retain, nonatomic) NSMutableArray *playerarray;//array of players
@property (retain, nonatomic) Player *addplayer;//player and data

-(void) SetUp;

@end

//Starting Bracket, working with only 8. Later moving up to 32
@implementation Bracket

@synthesize playerarray;
@synthesize addplayer;

-(void) SetUp;//sets up the array
{
    int i;//counting fun!
    playerarray = [[NSMutableArray alloc] init];//initialize a bracket
    for(i = 0; i < 8; i++)//To add the players
    {

        Player *addplayerx = [Player new];//New instance of Player

        NSString *p;//Not sure if I need two of them.
        NSString *tempname = @"bye";

        NSLog(@"Player %d Name:", i);
        scanf("%s",&p);
        tempname = p;
        NSLog(@"%s", tempname);
        addplayerx.name = p;
        NSLog(@"%s", addplayerx.name);
        addplayerx.wins = 0;
        addplayerx.losses = 0;
        addplayerx.bp = 0;
        [playerarray addObject: addplayerx];
        [addplayerx release];
        [p release];

    }
}


@end



//End function

int main (int argc, const char * argv[]) {
    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];

    Bracket *starting = [Bracket new];
    [starting SetUp];

    [pool drain];
    return 0;
}

【问题讨论】:

    标签: objective-c arrays pointers object scanf


    【解决方案1】:

    您不能将scanf() 转换为NSString。您需要扫描到一个常规的 C 字符串(确保为它分配内存),然后您可以使用 stringWithUTF8String: 或类似的方式从该字符串构造 NSString

    【讨论】:

    • 谢谢!这为我解决了这个问题。我还在适应它,但感谢您的建议,我取得了很大的进步。
    【解决方案2】:

    不要猜测:在调试器下运行应用程序,当它崩溃时,检查回溯。您还可以查看 ~/Library/Logs/DiagnosticReports/foo.crash 中的回溯。

    你想做什么,从文件中逐行读取数据?使用text = [NSString stringWithContentsOfFile:path] 然后在所有换行符上拆分text 会容易得多:

    NSCharacterSet *newlines = [NSCharacterSet newlineCharacterSet];
    NSArray *lines = [text componentsSeparatedByCharactersInSet:newlines];
    

    然后您可以循环并获取玩家姓名:

    NSMutableArray *players = [NSMutableArray arrayWithCapacity:[lines count]]; 
    NSString *whitespace = [NSCharacterSet whitespaceCharacterSet];
    for (NSString *line in lines) {
        NSString *name = [line stringByTrimmingCharactersInSet:whitespace];
        Player *player = [[[Player alloc] init] autorelease];
        player.name = name;
        [players addObject:player];
    }
    

    【讨论】:

    • 我打算稍后添加从文件读取的功能。我目前只是尝试从命令行本身添加值以进行练习。我现在正处于尝试打印播放器对象数组并获得存储位置的地址的地步。这对我没有太大帮助,因为我想得到名字等。 :(
    • 没关系。我只是想出了如何摆脱地址并取而代之的价值。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-24
    • 2011-11-29
    • 2012-09-01
    • 2021-06-05
    相关资源
    最近更新 更多