首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >变量而不是CFString

变量而不是CFString
EN

Stack Overflow用户
提问于 2011-04-19 09:10:00
回答 1查看 1.9K关注 0票数 0

我只编写了一个月的Ojective-C代码,就陷入了僵局。需要帮助。下面是一个故事:

  1. 我有一个简单的类LXPPlayingCard:

#import @ LXPPlayingCard : NSObject { @private NSString* cardCV;@私有int位置;} @property (ReadW区,assign) NSString* cardCV;@property (ReadW区,assign) int位置;@end @implementation LXPPlayingCard @合成cardCV;@合成位置;@end

  • 也几乎没有更复杂的类LXPDeck:

#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:

代码语言:javascript
复制
@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

以及主窗口上的两个按钮,我将其链接到openNewDeckprintDeckContent方法。问题是,应用程序出现了错误"EXC_BAD_ACCESS“,并且它发生在i=3上,因为(当我使用调试器时) [card[i] cardCV]不是CFString。

我试着用不同的字符串来填充甲板,有时程序在显示[cards[i] cardCV]的第一圈上失败。我真的不明白会发生什么,但我想它与指针和内存分配规则有某种联系,因为简单类型的数据(例如position)没有问题,如果showList方法从fill方法调用,它就能正常工作。拜托,帮我一把!我要疯了!这个程序太简单了,我真的很担心未来编码中的问题.

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-04-19 09:28:15

问题是

代码语言:javascript
复制
[cardlist substringWithRange:NSMakeRange(i,2)]]

返回您不拥有的NSString。由于您不拥有它,所以不能保证字符串在LXPPlayingCard对象的生存期内是有效的。如果希望保留对该字符串的有效引用,则应修改LXPPlayingCard的声明,使cardCV属性成为copy属性,而不是assign属性。取代:

代码语言:javascript
复制
@property (readwrite, assign) NSString* cardCV;

通过以下方式:

代码语言:javascript
复制
@property (readwrite, copy) NSString* cardCV;

通过这样做,当您发送-setCardCV:时,例如:

代码语言:javascript
复制
[cards[j] setCardCV:[cardlist substringWithRange:NSMakeRange(i,2)]];

setCardCV将复制其参数[cardlist substringWithRange:NSMakeRange(i,2)],您的对象将拥有该字符串的所有权。这意味着字符串将在该对象的整个生命周期中保持有效。请记住,既然您已经拥有了该字符串,您将负责释放它。因此,需要实现一个-dealloc方法:

代码语言:javascript
复制
- (void)dealloc {
    [cardCV release];
    [super dealloc];
}

这意味着当相应的LXPPlayingCard被释放时,存储在cardCV中的字符串也会被释放。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5714059

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档