【发布时间】:2011-04-19 09:10:00
【问题描述】:
我在 Ojective-C 上编写了一个月的代码并陷入了僵局。需要帮忙。 故事如下:
-
我有一个简单的 LXPlayingCard 类:
#import <Cocoa/Cocoa.h> @interface LXPPlayingCard : NSObject { @private NSString* cardCV; @private int position; } @property (readwrite, assign) NSString* cardCV; @property (readwrite,assign) int position; @end @implementation LXPPlayingCard @synthesize cardCV; @synthesize position; @end -
另外,我还有几乎没有更复杂的 LXPDeck 类:
#import <Cocoa/Cocoa.h> #import "LXPPlayingCard.h" @interface LXPDeck : NSObject { LXPPlayingCard* cards[100]; int deckCapacity; } -(void) fill:(NSString *) cardlist; -(void) showList; -(int) deckCapacity; @end #import "LXPDeck.h" #import "LXPPlayingCard.h" @implementation LXPDeck -(void) fill:(NSString *) cardlist { int l,i,j; l=[cardlist length]; j=0; for (i=0;i<l;i+=2) { cards[j]=[[LXPPlayingCard alloc] init] ; [cards[j] setCardCV:[cardlist substringWithRange:NSMakeRange(i,2)]]; [cards[j] setPosition:j+1]; NSLog(@"%@",[cards[j] cardCV]); j++; } deckCapacity=j; } -(int) deckCapacity { return deckCapacity;} -(void) showList { NSLog(@"deck capacity:%d",deckCapacity); NSString * temp; temp=[[NSString alloc] init]; for (int i=0;i<deckCapacity;i++) { NSLog(@"card[%d]=%d, adress:%p",i,[cards[i] position],cards[i]); temp=[cards[i] cardCV]; NSLog(@"%@",temp); } } @end
它做了几件事:从字符串中填充带有名称(setCardCV)的卡片数组,并打印卡片组的内容(showList)。 此外,我创建了一个 AppController 类:
@interface LXPAppController : NSObject {
}
-(IBAction) openNewDeck:(NSButton * )sender;
-(IBAction) printDeckContent:(NSButton *)sender ;
@end
#import "AppController.h"
#import "LXPDeck.h"
@implementation LXPAppController
BOOL deckOpened=FALSE;
LXPDeck* workDeck;
-(IBAction) openNewDeck:(NSButton *) sender{
if (!deckOpened) {
NSLog(@"Opening new deck...");
workDeck=[LXPDeck alloc];
[workDeck fill:@"pacataca"];
}
deckOpened=TRUE;
}
-(IBAction) printDeckContent:(NSButton *) sender {
if (deckOpened) {
NSLog(@"Printing deck content...");
[workDeck showList];
}
}
@end
以及我链接到openNewDeck 和printDeckContent 方法的主窗口上的两个按钮。
问题是应用程序因错误“EXC_BAD_ACCESS”而崩溃,它发生在i=3 上,因为(当我使用调试器时)[card[i] cardCV] 不是 CFString。
我尝试使用不同的字符串来填充卡片组,有时程序在显示[cards[i] cardCV] 的第一圈失败。
我真的不明白会发生什么,但我猜它与指针和内存分配规则有某种联系,因为简单类型的数据(例如position)没有问题,如果showList方法从@调用,它可以正常工作987654331@ 方法。
请帮我一把!我要疯了!程序太简单了,我真的很担心以后编码的问题……
【问题讨论】:
-
我强烈建议使用 NSMutableArray 类,cards[j] 看起来 c-ish。
标签: objective-c cfstring