我只编写了一个月的Ojective-C代码,就陷入了僵局。需要帮助。下面是一个故事:
#import @ LXPPlayingCard : NSObject { @private NSString* cardCV;@私有int位置;} @property (ReadW区,assign) NSString* cardCV;@property (ReadW区,assign) int位置;@end @implementation LXPPlayingCard @合成cardCV;@合成位置;@end
#import #import "LXPPlayingCard.h“@ LXPDeck : NSObject { LXPPlayingCard* cards100;int deckCapacity;}-(NSString *) NSString;-(NSString *) NSString;-(NSString) showList;-( int ) deckCapacity;@end #import "LXPPlayingCard.h”@Importing“LXPplayingCard.h”-(void)填充:(NSString*)卡列表{int l,i,j;l=cardlist长度;j=0;for (i=0;i
这就做了一些事情:用字符串中的名称(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方法从fill方法调用,它就能正常工作。拜托,帮我一把!我要疯了!这个程序太简单了,我真的很担心未来编码中的问题.
发布于 2011-04-19 09:28:15
问题是
[cardlist substringWithRange:NSMakeRange(i,2)]]返回您不拥有的NSString。由于您不拥有它,所以不能保证字符串在LXPPlayingCard对象的生存期内是有效的。如果希望保留对该字符串的有效引用,则应修改LXPPlayingCard的声明,使cardCV属性成为copy属性,而不是assign属性。取代:
@property (readwrite, assign) NSString* cardCV;通过以下方式:
@property (readwrite, copy) NSString* cardCV;通过这样做,当您发送-setCardCV:时,例如:
[cards[j] setCardCV:[cardlist substringWithRange:NSMakeRange(i,2)]];setCardCV将复制其参数[cardlist substringWithRange:NSMakeRange(i,2)],您的对象将拥有该字符串的所有权。这意味着字符串将在该对象的整个生命周期中保持有效。请记住,既然您已经拥有了该字符串,您将负责释放它。因此,需要实现一个-dealloc方法:
- (void)dealloc {
[cardCV release];
[super dealloc];
}这意味着当相应的LXPPlayingCard被释放时,存储在cardCV中的字符串也会被释放。
https://stackoverflow.com/questions/5714059
复制相似问题