我正在尝试在UIViewController中实现UIRefreshControl.我不能使用UITableViewController,因为tableView只是我的viewController的一个部分.
在大多数情况下,这种解决方法就像魅力.但有时(随机发生)应用程序崩溃EXC_BAD_ACCESS code=1
- (void)viewDidLoad {
[super viewDidLoad];
UIRefreshControl * refCon = [[UIRefreshControl alloc] init];
[refCon addTarget:self selector:@selector(refresh:) forControlEvent:UIControlEventValueChanged];
[tableView addSubView:refCon];
}
- (void)refresh:(UIRefreshControl *)sender {
[NSThred detachNewThreadSelector:@selector(doRefresh:) toTarget:self withObject:sender];
}
- (void)doRefresh:(UIRefreshControl *)sender {
[self checkUpdate];
[self loadData];
[sender endRefreshing];
}
Run Code Online (Sandbox Code Playgroud) exc-bad-access uitableview uiviewcontroller uirefreshcontrol
有一段时间我很难找到解决方案,我搜索了谷歌,stackoverflow但无法解决这个问题.
我有2个视图控制器(我们称之为VC1和VC2),我可以在它们之间进行切换,没有任何问题.为了呈现VC2,我使用:
UIStoryboard* storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil];
UINavigationController* ctrl = [storyboard instantiateViewControllerWithIdentifier:@"histListID"];
[self presentViewController:ctrl animated:YES completion:nil];
Run Code Online (Sandbox Code Playgroud)
要回到VC1,我使用:
- (IBAction)backPressed:(id)sender {
[self dismissViewControllerAnimated:YES completion:nil];
}
Run Code Online (Sandbox Code Playgroud)
VC2包含一个表视图,在我删除一些单元格后,如果我尝试返回VC1,我得到EXC_BAD_ACCESS(代码= 1).我以前从来没有处理过这个问题,我知道它可能与我代码中的某些地方有关.但我真的不知道如何解释它.它与我的tableView有关吗?在解雇控制器时我做错了什么?

如果您需要更多代码,请询问,我真的需要解决它.
PS:我打开了ARC.
编辑:用于删除单元格的代码
[self deleteItemAt:chosenItem];
[tableView reloadData];
Run Code Online (Sandbox Code Playgroud)
基本上deleteItemAt所做的是从数组中删除一些对象:
- (void)deleteItemAt:(int)index
{
[self.histModel deleteFileAtIndex:index];
if ([self isWeekSelected]) {
[self updateWeekDic];
}else{
[self updateMonthDic];
}
[callout dismissAnimated:YES];
}
Run Code Online (Sandbox Code Playgroud)
很抱歉,如果它没有正确执行我没有编写代码的那部分,但我不认为它与删除单元格有关.
使用最新的 Xcode 11 升级到 macOS Catalina 后,在进行单元测试时,我无法直接从用户路径读取文件,例如:
PROJECT_DIR + "/FolderX/myFile.json",我不断收到错误Thread 1: EXC_BAD_ACCESS (code=1, address=0x8)
当我尝试使用自定义路径打开 couchbase lite 数据库时,也会发生这种情况。错误:
error opening!: 14
Cannot open database, Error : Error Domain=SQLite Code=14 "unable to open database file" UserInfo={NSLocalizedDescription=unable to open database file}
我相信这是一个问题,因为我的模拟器和最新的 Catalina 之间存在读写访问权限。
我目前的解决方法是将我的文件和数据库添加到目标成员资格并直接从[NSBundle bundleForClass:[self class]].bundlePath. 有没有更好的解决方法?像调整任何设置以允许它像旧版本一样从自定义路径读取文件?
我在Objective-C中有一行非常简单的代码:
if ((selectedEntity != nil) && [selectedEntity isKindOfClass:[MobileEntity class]])
Run Code Online (Sandbox Code Playgroud)
我偶尔也无缘无故地说,游戏在EXC-BAD-ACCESS的这行代码上崩溃了.它通常似乎是关于某些东西被从游戏领域中移除的时间,所以我猜测selectedEntity 是什么被 dealloc'd,然后这结果.除了是不可能选择退出实体(但谁知道,也许这实际上不是真正的在我的代码......),事实上,我特别检查,看看是否有是一个selectedEntity之前,我访问它意味着,我不该这里有任何问题.Objective-C应该支持布尔短约束,但似乎不是编辑:看起来像短路与问题无关.
另外,我在这个代码块周围放了一个@ try/@ catch,因为我知道它偶尔会爆炸,但是这似乎被忽略了(我猜测EXC-BAD-ACCESS无法捕获).
所以基本上我想知道是否有人知道我可以抓住这个并把它抛出的方式(因为我不关心这个错误,只要它不会让游戏崩溃)或者可以解释为什么它可能会发生.我知道Objective-C用"nil"值做了奇怪的事情,所以我猜它指的是一些既不是对象指针也不是nil的奇怪空间.
编辑:只是为了澄清,我知道下面的代码是错误的,这是我猜测在我的程序中发生的事情.我问这是否会导致问题 - 确实如此.:-)
编辑:看起来有一个边缘案例,允许您在删除之前选择一个实体.所以,似乎代码的进展如下:
selectedEntity = obj;
NSAutoreleasePool *pool = ...;
[obj release];
if (selectedEntity != nil && etc...) {}
[pool release];
Run Code Online (Sandbox Code Playgroud)
所以我猜测因为Autorelease池还没有被释放,所以对象不是nil,但是它的保留计数是0,所以不允许它被访问...或者沿着这些线路?
此外,我的游戏是单线程的,所以这不是一个线程问题.
编辑:我以两种方式修复了问题.首先,我不允许在该边缘案例中选择实体.其次,不是只调用[entities removeObjectAtIndex:i](删除任何将被删除的实体的代码),而是将其更改为:
//Deselect it if it has been selected.
if (entity == selectedEntity)
{
selectedEntity = nil;
}
[entities removeObjectAtIndex:i];
Run Code Online (Sandbox Code Playgroud)
正如jib建议的那样,确保在释放变量的同时为变量分配nil.
我正在编写一个简单的C程序来创建十二色调矩阵.代码编译,但我得到运行时错误'总线错误'.在调试器中它说EXC_BAD_ACCESS.
int main ()
{
int j,k,l;
int twelve[13][13];
void mat(int twelve[13][13]);
printf("input original tone row \n");
for(j=0;j<=11;j++)
{
scanf("%2i",&twelve[j][0]);
}
mat(twelve);
for(k=0;k<=11;k++)
{
for(l=0;l<=11;l++)
{
printf("%i ",twelve[l][k]);
}
printf("\n");
}
return 0;
}
void mat(twelve)
int twelve[13][13];
{
int j,k,l;
int temp;
/*inversion*/
for(j=1;j<=11;j++)
{
twelve[0][j] = 12 - twelve[j][0];
}
/*fill in columns*/
/*this sections seems to be what's crashing it */
for(k=1;k<=11;k++)
{
for(l=1;1<=11;l++)
{
temp = twelve[0][k] + twelve[l][0];
if(temp >= 12)
{
twelve[k][l] …Run Code Online (Sandbox Code Playgroud) 我花了好几个小时试图让我的项目工作,但我无法让它工作.
基本上,我正在尝试使用NSUserDefaults来保存自定义对象,当用户点击保存按钮并在应用加载时加载所有数据.如果没有保存以前的NSUserDefault,我想设置一些默认值.最后,我在尝试加载以前保存的NSUserDefault时收到EXC_BAD_ACCESS.设置起始数据时,它在第一次加载时工作正常.问题是,当我尝试为它启用NSZombieEnabled和其他env变量时,它会在没有EXC_BAD_ACCESS的情况下以某种方式加载.所以这就是我正在使用的:
[App Delegate.h]
#import <UIKit/UIKit.h>
#import "Note.h"
@interface ToDoWallAppDelegate : NSObject <UIApplicationDelegate> {
...
Note *note;
}
...
@property (retain) Note *note;
@end
Run Code Online (Sandbox Code Playgroud)
[App Delegate.m]
- (void)applicationDidFinishLaunching:(UIApplication *)application {
...
note = [[Note alloc] init];
NSUserDefaults *stdDefaults = [NSUserDefaults standardUserDefaults];
NSData *noteData = [stdDefaults objectForKey:@"Note"];
if (noteData) {
self.note = (Note *)[NSKeyedUnarchiver unarchiveObjectWithData:noteData];
} else {
note.background = [UIImage imageNamed:@"Cork.jpg"];
note.picture = [UIImage imageNamed:@"Cork.jpg"];
note.font = [UIFont fontWithName:@"Helvetica" size:18.0f];
note.fontColor = [UIColor blackColor];
note.fontNameIndex = 9;
note.fontSizeIndex = 6; …Run Code Online (Sandbox Code Playgroud) 好的,这一直困扰着我一段时间......
我已检查过,所有其他问题/答案都与非ARC项目有关.
每当我提出MFMCvc并且我快速取消消息时,我就会在iPhone上收到Thread1:EXEC_BAD_ACCESS错误消息.可以在iPad上正常工作,或者我让它静坐(比如30秒或更长时间)
有什么建议吗?(除了放一个计时器而不是在计时器启动之前解雇?)
BTW我对MFMessageComposeViewController做了同样的事情,它在iPhone和iPad上运行良好.
这是我的代码来呈现它
if (([action isEqualToString:@"EMail"]) && contact.length>0)
{
MFMailComposeViewController *mailViewController = [[MFMailComposeViewController alloc] init];
if([MFMailComposeViewController canSendMail]) {
[mailViewController setSubject:@""];
[mailViewController setMessageBody:@"" isHTML:NO];
[mailViewController setToRecipients:[NSArray arrayWithObject:contact]];
[mailViewController setMailComposeDelegate:self];
[self presentModalViewController:mailViewController animated:NO];
}
}
Run Code Online (Sandbox Code Playgroud)
这是我解雇它的地方
-(void)mailComposeController:(MFMailComposeViewController *)controller didFinishWithResult:(MFMailComposeResult)result error:(NSError *)error
{
switch (result)
{
case MFMailComposeResultCancelled:
{
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Send EMail" message:@"EMail Has Been Cancelled"
delegate:self cancelButtonTitle:@"OK" otherButtonTitles: nil];
[alert show];
}
break;
case MFMailComposeResultFailed:
{
NSLog(@"Error");
}
break;
case MFMailComposeResultSent:
{
UIAlertView *alert = …Run Code Online (Sandbox Code Playgroud) 撞到sqlite3_step线?
我只是从数据库中删除该行.它有时并不总是抛出EXC_BAD_ACCESS.
下面是代码的截图.
任何建议的家伙.

因此,今天的演习是创建一个函数initialize an array of int,并fill it从0到n.
我写了这个:
void function(int **array, int max)
{
int i = 0;
*array = (int *) malloc((max + 1) * sizeof(int));
while (i++ < max)
{
*array[i - 1] = i - 1; // And get EXC_BAD_ACCESS here after i = 2
}
}
Run Code Online (Sandbox Code Playgroud)
经过几个小时的EXC_BAD_ACCESS疯狂后,我决定搜索SO,找到这个问题:在函数中初始化数组
然后将我的函数更改为:
void function(int **array, int max)
{
int *ptr; // Create pointer
int i = 0;
ptr = (int *) malloc((max + 1) …Run Code Online (Sandbox Code Playgroud) 我遇到了一个奇怪的错误,想检查我是否正在使用我的Key值正确观察NSUserDefaults的变化.
我在我的应用程序的两个地方使用了这个代码没有问题,然后我添加了第三个控制器,它观察"goldCount"和"energyCount"的值.现在,当我设置初始值时,应用程序崩溃与exc_bad_access.我在使用父视图后2秒将该控制器添加到视图中performSelectorAfterDelay.
在显示游戏屏幕之前,我设置了以下属性:
//crash on this line
[[NSUserDefaults standardUserDefaults] setInteger:200 forKey: goldCount];
[[NSUserDefaults standardUserDefaults] setInteger:150 forKey: energyCount];
Run Code Online (Sandbox Code Playgroud)
在3个不同的视图控制器中,我在viewDidLoad中有这个代码:
NSUserDefaults* defaults = [NSUserDefaults standardUserDefaults];
[defaults addObserver:self
forKeyPath:@"goldCount"
options:NSKeyValueObservingOptionNew
context:NULL];
[defaults addObserver:self
forKeyPath:@"energyCount"
options:NSKeyValueObservingOptionNew
context:NULL];
self.goldLabel.text = [NSString stringWithFormat:@"%i",[[GameDataManager sharedInstance] currentGoldCount]];
self.energyLabel.text = [NSString stringWithFormat:@"%i",[[GameDataManager sharedInstance] currentEnergyCount]];
Run Code Online (Sandbox Code Playgroud)
以下是该类更新其标签的方式:
// KVO handler
-(void)observeValueForKeyPath:(NSString *)aKeyPath ofObject:(id)anObject
change:(NSDictionary *)aChange context:(void *)aContext
{
//aKeyPath gives us the name of a user default that has changed
if([aKeyPath isEqualToString:@"goldCount"])
{
//we are interested in the new …Run Code Online (Sandbox Code Playgroud) exc-bad-access objective-c key-value-observing nsuserdefaults ios
exc-bad-access ×10
ios ×4
iphone ×4
objective-c ×3
xcode ×3
c ×2
pointers ×2
crash ×1
directory ×1
macos ×1
malloc ×1
memory ×1
mfmailcomposeviewcontroller ×1
project ×1
uitableview ×1
xcode11 ×1