我目前正在为iPhone开发第一个应用程序,已经完成,但是内存管理等存在问题。请记住,我对Java相当满意,并且我只学习了大约4天的ObjectiveC。
因此,确切的问题在于此区域(在星号的行之间)。
注意:如果重要的话,所有代码都位于大型游戏循环中。
else
{
***********************************
NSString *rand = [NSString stringWithFormat:@"%@", randNumberS];
while(lastTime + interval >= currentTime)
{
!!!!!!!!!NSString *user = [NSString stringWithFormat:@"%@", userText];
if([user isEqualToString: rand])
{
***********************************
score += 10;
randNumberS = nil;
timeToGenerateNum = true;
bottomClear = true;
break;
}
else
{
//NSLog(@"%@ != %@, %i", userText, randNumberS, score);
}
}
NSLog(@"Game Over! Your score was %i!", score);
}
}
每次我在启用僵尸程序之前运行(注意:代码连续运行了几秒钟),在标有“!”的行上都有一个
Thread 6: Program received signal: "EXC_BAD_ACCESS"
。启用僵尸后,它会运行几秒钟,然后停止工作,并在控制台中显示消息-[CFString respondsToSelector:]: message sent to deallocated instance 0x11168440
。它还用“!”标记同一行。我对这两种方法都进行了查找,它们都指出内存管理不佳,我尝试释放NSString对象,但是程序不允许我释放对象(注意:我收到此错误消息
"release" is unavailable: not available in automatic reference counting mode
)。任何帮助将不胜感激,谢谢!
编辑:
userText用于多种方法中,但大多数用于此方法中。
-(IBAction)button1Clicked:(id)sender
{
if(userText == nil)
{
userText = [NSString stringWithFormat:@"%i", 1];
}
else
{
userText = [NSString stringWithFormat:@"%@%i",userText , 1];
}
bottomLabel.text = userText;
NSLog(@"Test 1");
}
最佳答案
userText
变量不是有效的对象,这就是您的错误消息所指示的内容。通常,当您尝试使用指向不再存在的指针时,会发生EXC_BAD_ACCESS。然后启用了“僵尸”功能后,该消息将更加清晰,userText
曾经是字符串,但是已经被释放。
编辑:
如果userText是实例变量,则建议使用属性,然后使用点表示法。在某处的@interface节中声明了userText。它看起来应该像这样:
@property (nonatomic, strong) NSString *userText;
然后在@implementaiton区域中,如下所示:
@synthesize userText = _userText;
这些一起使点符号可用,然后您应该使用self.userText在各处访问它(自定义访问器除外):
self.userText = @"something";
NSString *something = self.userText;