Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/36.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone 在Init中调用方法时Cocos2d项目崩溃:_Iphone_Objective C_Xcode_Cocos2d Iphone - Fatal编程技术网

Iphone 在Init中调用方法时Cocos2d项目崩溃:

Iphone 在Init中调用方法时Cocos2d项目崩溃:,iphone,objective-c,xcode,cocos2d-iphone,Iphone,Objective C,Xcode,Cocos2d Iphone,我试图通过构建一个简单的纸牌游戏来尝试cocos2d。我对iOS开发并不陌生,但我对cocos2d引擎非常陌生。到目前为止,我有2个自定义类: 卡片类别: h 和甲板舱: h 奇怪的是,如果我在drawCardAndShow方法中移动牌组alloc init和shuffle,它就不会崩溃,但是这不是正确的位置,原因很明显,因为我不想每次抽牌都换一副全新的牌组 有什么帮助吗?您应该将deck设置为属性您应该将deck设置为属性我看到一个严重的问题,但您的代码有多个问题 当字符串作为属性时,应将其声

我试图通过构建一个简单的纸牌游戏来尝试cocos2d。我对iOS开发并不陌生,但我对cocos2d引擎非常陌生。到目前为止,我有2个自定义类:

卡片类别: h

和甲板舱: h

奇怪的是,如果我在drawCardAndShow方法中移动牌组alloc init和shuffle,它就不会崩溃,但是这不是正确的位置,原因很明显,因为我不想每次抽牌都换一副全新的牌组


有什么帮助吗?

您应该将deck设置为属性

您应该将deck设置为属性

我看到一个严重的问题,但您的代码有多个问题

当字符串作为属性时,应将其声明为副本,在您的情况下,应将其作为赋值:

@property (nonatomic, readonly) NSString *suit;
如果要将属性声明为只读,可以再次在.m中声明该属性以使其在内部可写:

@interface Card() 
@property (nonatomic, copy)
NSString *suit; 
@end
当您访问ivar和访问属性时,您应该使用属性的
self.
符号向其他人表明您的意图

你这里有个内存泄漏:

Card *card = [[Card alloc] initWithSprite:cardImage suit:suitString andValue:i];
            [cardsArray addObject:card];
-->missing [card release]
这是不必要的

@interface Deck : NSObject {
NSMutableArray *cardsArray;
}
@property (nonatomic, retain) NSMutableArray *cardsArray;
您可以省略ivar,只需确保在没有自动释放的情况下不会alloc/init

如果你坚持要使用ivar,请至少重命名为_cardsArray,然后

@synthesize cardsArray=_cardsArray
这样你就可以区分两者了。在一种情况下,您需要显式地保留,在另一种情况下,您使用setter/getter


hth

我看到一个严重的问题,但您的代码有多个问题

当字符串作为属性时,应将其声明为副本,在您的情况下,应将其作为赋值:

@property (nonatomic, readonly) NSString *suit;
如果要将属性声明为只读,可以再次在.m中声明该属性以使其在内部可写:

@interface Card() 
@property (nonatomic, copy)
NSString *suit; 
@end
当您访问ivar和访问属性时,您应该使用属性的
self.
符号向其他人表明您的意图

你这里有个内存泄漏:

Card *card = [[Card alloc] initWithSprite:cardImage suit:suitString andValue:i];
            [cardsArray addObject:card];
-->missing [card release]
这是不必要的

@interface Deck : NSObject {
NSMutableArray *cardsArray;
}
@property (nonatomic, retain) NSMutableArray *cardsArray;
您可以省略ivar,只需确保在没有自动释放的情况下不会alloc/init

如果你坚持要使用ivar,请至少重命名为_cardsArray,然后

@synthesize cardsArray=_cardsArray
这样你就可以区分两者了。在一种情况下,您需要显式地保留,在另一种情况下,您使用setter/getter


hth

谢谢:)当我写这些属性时,我知道我做错了什么,但我从来没有想过以后要更改它们。我不确定我是否理解我应该如何处理cardsArray。你能更具体地解释一下我该做什么吗?谢谢谢谢:)当我写这些属性的时候,我知道我做错了什么,但我从来没有想过以后要修改它们。我不确定我是否理解我应该如何处理cardsArray。你能更具体地解释一下我该做什么吗?谢谢