解决 Cocoa 中的 EXC_BAD_ACCESS 问题?

2023-11-29


嘿..我在可可中有以下方法..

-(void)startUploadWithContainerName:(NSString *)containerName
{
//Make an object of NSFileManager and Fetch an array of local folder contents and cloud folder contents
NSFileManager *uploadManager=[[NSFileManager alloc] init];
NSString *uploadPath=[[[NSString alloc] initWithString:@"~/Cloud Briefcase"] stringByExpandingTildeInPath];
NSError *err;
NSArray *uploadFolderContents=[uploadManager contentsOfDirectoryAtPath:uploadPath error:&err];
ASICloudFilesObjectRequest *cloudList = [ASICloudFilesObjectRequest listRequestWithContainer:containerName];
[cloudList startSynchronous];
NSArray *cloudFolderContents = [cloudList objects];

[cloudList release];
[uploadManager release];

NSLog(@"%lu",[uploadFolderContents count]);
NSLog(@"\n%@\n\n%@",cloudFolderContents,uploadFolderContents);
NSString *notFoundPath;
NSString *foundPath;
NSString *foundCloudMatch;
NSDate *cloudUploadDate;

for (int j=1; j<[uploadFolderContents count]; j++) {
    int i=0;
    for (int k=0; k<[cloudFolderContents count]; k++) {
        if ([[[cloudFolderContents objectAtIndex:k] name] isEqualToString:[uploadFolderContents objectAtIndex:j]]) {
            i=1;
            foundPath=[uploadFolderContents objectAtIndex:j];
            foundCloudMatch=[cloudFolderContents objectAtIndex:k];
            cloudUploadDate=[[cloudFolderContents objectAtIndex:k] lastModified];
            break;
        }
        else{
            i=0;
            notFoundPath=[uploadFolderContents objectAtIndex:j];
            continue;
        }
    }

    if (i==1) {
        NSLog(@"Found In Cloud: %@",foundPath);
        NSString *uploadPath=[[NSString stringWithFormat:@"~/Cloud Briefcase/%@",foundPath] stringByExpandingTildeInPath];
        NSTimeZone *tCST=[NSTimeZone timeZoneWithAbbreviation:@"CST"];
        NSInteger cloudDifference=[tCST secondsFromGMTForDate:cloudUploadDate];

        NSFileManager *typeManager=[[NSFileManager alloc] init];
        NSError *Er;
        NSDictionary *propertiesOfUploadFile=[typeManager attributesOfItemAtPath:uploadPath error:&Er];

        NSDate *localUploadDate=[propertiesOfUploadFile objectForKey:NSFileModificationDate];

        NSInteger sourceUploadDifference=[[NSTimeZone systemTimeZone] secondsFromGMTForDate:localUploadDate];


        NSLog(@"Local Date %@",localUploadDate);
        NSLog(@"Local Difference %ld",sourceUploadDifference);
        NSTimeInterval diff=sourceUploadDifference-cloudDifference;
        NSTimeInterval sDiff=sourceUploadDifference;
        NSDate *lDate=[[NSDate alloc] initWithTimeInterval:sDiff sinceDate:localUploadDate];
        NSDate *comparisonDate=[[NSDate alloc] initWithTimeInterval:diff sinceDate:cloudUploadDate];
        NSLog(@"\nSDiff Value %@",lDate);
        NSLog(@"Comparison Date %@",comparisonDate);

        [localUploadDate release];
        [propertiesOfUploadFile release];
        [typeManager release];
        [tCST release];

        if ([comparisonDate compare:lDate]==NSOrderedAscending) {
            [comparisonDate release];
            [lDate release];
            NSLog(@"Got It");
            NSString *escString=[foundPath stringByAddingPercentEscapesUsingEncoding:NSASCIIStringEncoding];
            ASICloudFilesObjectRequest *request = 
            [ASICloudFilesObjectRequest putObjectRequestWithContainer:containerName objectPath:escString contentType:@"file" file:uploadPath metadata:nil etag:nil];
            [request startSynchronous];
            NSLog(@"Uploaded %@",foundPath);
        }



    }
    else{
        NSLog(@"Not Found In Cloud: %@",notFoundPath);
        NSString *uploadPath=[[NSString stringWithFormat:@"~/Cloud Briefcase/%@",notFoundPath] stringByExpandingTildeInPath];
        //          NSLog(@"%@",uploadPath);


        NSString *escString=[notFoundPath stringByAddingPercentEscapesUsingEncoding:NSASCIIStringEncoding];
        NSLog(@"URL ENCODED VALUE: %@",escString);

        ASICloudFilesObjectRequest *request = 
        [ASICloudFilesObjectRequest putObjectRequestWithContainer:containerName objectPath:escString contentType:@"file" file:uploadPath metadata:nil etag:nil];
        [request startSynchronous];
        NSLog(@"Upload Complete");
    }
}
[uploadPath release];

[cloudList release];
[uploadFolderContents release];

 }

但它挂起显示异常

收到信号 EXC_BAD_ACCESS

有人能解决这个问题吗?异常发生在NSLog(@"在云端找到:%@",foundPath);


通常,您会将环境变量 NSZombieEnabled 设置为 YES,然后解决问题。 在你的例子中,我看到你声明了指针,但没有指向任何危险的对象。在 Clang 分析器中运行代码会将其报告为警告。 将这些指针设置为零。您已经声明了字符串指针,但在 for 循环中,如果“if”不为 true,则它会转到 else ,其中 findPath 从未指向任何内容,并且您尝试在 if(i==1) 中访问它

Update:另请考虑 Lou Franco 的答案。他也是对的。您不拥有 cloudList 对象。它是自动释放的,并且您通过将释放消息传递给 cloudList 对象 [cloudList release] 来过度释放它。 在您的情况下,当您释放它时,它可能不会立即崩溃,因为控制位于同一循环中。一旦当前线程自动释放池耗尽,您的代码将因 EXC_BAD_ACCESS 崩溃。

ASICloudFilesObjectRequest *cloudList = [ASICloudFilesObjectRequest listRequestWithContainer:containerName];
[cloudList startSynchronous];
NSArray *cloudFolderContents = [cloudList objects];
[cloudList release];// Remove this line 

Update2:

NSString *uploadPath=[[[NSString alloc] initWithString:@"~/Cloud Briefcase"] stringByExpandingTildeInPath];

将上面的内容改为

NSString *uploadPath=[[NSString stringWithFormat:@"~/Cloud Briefcase"] stringByExpandingTildeInPath];

上面一行中的 uploadPath 仍然指向自动释放的对象。您正在泄漏您创建的字符串。调用release是错误的。因此,删除 [uploadPath release] 和 [cloudList release],您将一次又一次地发布它。为什么你要释放明显自动释放的对象 uploadFolderContents ?从代码中删除这三行:

[uploadPath release];

[cloudList release];
[uploadFolderContents release];

Update3:修复了过度释放的问题。 if 块中的 updatePath 更改为 updatePathLocal,其中 updatePath 变量与方法范围存在冲突。

-(void)startUploadWithContainerName:(NSString *)containerName
{
//Make an object of NSFileManager and Fetch an array of local folder contents and cloud folder contents
NSFileManager *uploadManager=[[NSFileManager alloc] init];
NSString *uploadPath=[[NSString stringWithFormat:@"~/Cloud Briefcase"] stringByExpandingTildeInPath];
NSError *err = nil;
NSArray *uploadFolderContents=[uploadManager contentsOfDirectoryAtPath:uploadPath error:&err];
ASICloudFilesObjectRequest *cloudList = [ASICloudFilesObjectRequest listRequestWithContainer:containerName];
[cloudList startSynchronous];
NSArray *cloudFolderContents = [cloudList objects];

[uploadManager release];

NSLog(@"%lu",[uploadFolderContents count]);
NSLog(@"\n%@\n\n%@",cloudFolderContents,uploadFolderContents);
NSString *notFoundPath = nil;
NSString *foundPath = nil;
NSString *foundCloudMatch = nil;
NSDate *cloudUploadDate = nil;

for (int j=1; j<[uploadFolderContents count]; j++) {
    int i=0;
    for (int k=0; k<[cloudFolderContents count]; k++) {
        if ([[[cloudFolderContents objectAtIndex:k] name] isEqualToString:[uploadFolderContents objectAtIndex:j]]) {
            i=1;
            foundPath=[uploadFolderContents objectAtIndex:j];
            foundCloudMatch=[cloudFolderContents objectAtIndex:k];
            cloudUploadDate=[[cloudFolderContents objectAtIndex:k] lastModified];
            break;
        }
        else{
            i=0;
            notFoundPath=[uploadFolderContents objectAtIndex:j];
            continue;
        }
    }

    if (i==1) {
        NSLog(@"Found In Cloud: %@",foundPath);
        NSString *uploadPathLocal=[[NSString stringWithFormat:@"~/Cloud Briefcase/%@",foundPath] stringByExpandingTildeInPath];
        NSTimeZone *tCST=[NSTimeZone timeZoneWithAbbreviation:@"CST"];
        NSInteger cloudDifference=[tCST secondsFromGMTForDate:cloudUploadDate];

        NSFileManager *typeManager=[[NSFileManager alloc] init];
        NSError *Er = nil;
        NSDictionary *propertiesOfUploadFile=[typeManager attributesOfItemAtPath:uploadPathLocal error:&Er];

        NSDate *localUploadDate=[propertiesOfUploadFile objectForKey:NSFileModificationDate];

        NSInteger sourceUploadDifference=[[NSTimeZone systemTimeZone] secondsFromGMTForDate:localUploadDate];


        NSLog(@"Local Date %@",localUploadDate);
        NSLog(@"Local Difference %ld",sourceUploadDifference);
        NSTimeInterval diff=sourceUploadDifference-cloudDifference;
        NSTimeInterval sDiff=sourceUploadDifference;
        NSDate *lDate=[[NSDate alloc] initWithTimeInterval:sDiff sinceDate:localUploadDate];
        NSDate *comparisonDate=[[NSDate alloc] initWithTimeInterval:diff sinceDate:cloudUploadDate];
        NSLog(@"\nSDiff Value %@",lDate);
        NSLog(@"Comparison Date %@",comparisonDate);

        [typeManager release];

        if ([comparisonDate compare:lDate]==NSOrderedAscending) {
            [comparisonDate release];
            [lDate release];
            NSLog(@"Got It");
            NSString *escString=[foundPath stringByAddingPercentEscapesUsingEncoding:NSASCIIStringEncoding];
            ASICloudFilesObjectRequest *request = 
            [ASICloudFilesObjectRequest putObjectRequestWithContainer:containerName objectPath:escString contentType:@"file" file:uploadPath metadata:nil etag:nil];
            [request startSynchronous];
            NSLog(@"Uploaded %@",foundPath);
        }
    }
    else{
        NSLog(@"Not Found In Cloud: %@",notFoundPath);
        NSString *uploadPathLocal=[[NSString stringWithFormat:@"~/Cloud Briefcase/%@",notFoundPath] stringByExpandingTildeInPath];
        //          NSLog(@"%@",uploadPath);


        NSString *escString=[notFoundPath stringByAddingPercentEscapesUsingEncoding:NSASCIIStringEncoding];
        NSLog(@"URL ENCODED VALUE: %@",escString);

        ASICloudFilesObjectRequest *request = 
        [ASICloudFilesObjectRequest putObjectRequestWithContainer:containerName objectPath:escString contentType:@"file" file:uploadPathLocal metadata:nil etag:nil];
        [request startSynchronous];
        NSLog(@"Upload Complete");
    }
 }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

解决 Cocoa 中的 EXC_BAD_ACCESS 问题? 的相关文章

  • 转换 [NSNumber numberWithUnsignedInt:kCVPixelFormatType_32BGRA], (id)kCVPixelBufferPixelFormatTypeKey, nil];到斯威夫特

    这里出现错误 绞尽脑汁 尝试了各种组合 找不到类型 NSDictionary 的初始化程序 该初始化程序接受类型 object Int forKey CFString 的参数列表 configure the pixel format Obj
  • 带有 WatchPaths 键的 Launchd.plist:如何设置最小间隔?

    如何使用 WatchPath 键为 launchd plist 脚本设置最小间隔 例如 我希望每次目录中出现新文件时都运行一个脚本 但我希望它最多每小时运行一次 launchd plist 可能看起来像这样
  • Xcode 8 提交时“应用程序签名中缺少 aps 环境权利”

    我有一个应用程序 我们在过去 6 个月内提交了数十个版本 并且我们确实使用 APNS 升级到 Xcode 8 后 我收到了来自 Apple 的以下电子邮件 亲爱的开发者 我们发现您最近的交货存在一个或多个问题 应用程序名称 您的交货是 成功
  • 如何更改 UIActivityIndi​​catorView 以设置自定义图像?

    好吧 我正在寻找一种方法来更改我的微调器图像并使用自定义图像 有什么建议吗 我创建了一个UIActivityIndi catorView 的子类 https github com cncool CDActivityIndicatorView
  • 文件是为存档而构建的,这不是正在链接的体系结构(i386)

    我必须构建静态库 我想在我的 iPhone 和 iPad 应用程序中使用 当我尝试运行模拟器时 出现链接错误 我是 iOS 开发新手 请帮忙 ld 警告 忽略文件 Users valuelabs Desktop DruvaProject l
  • 在ios键盘上方显示建议工具栏

    我是iOS开发的新手 我正在尝试在 ios 5 1 中创建一个具有 textView 的拼写建议类型应用程序 这样如果用户点击键盘的某个键 则建议工具栏会出现在键盘顶部 其中包含所有建议 并且如果用户点击这些建议之一它将显示在 textVi
  • 检查文件是否是别名 Swift

    如何在 Mac 上检查文件是否为别名 到目前为止 这是我的代码 public func getFiles let folderPath Users timeBro Desktop testfolder let fileManager NSF
  • 有没有办法直观地看到精灵套件的 SKPhysicsbody 边界线?

    我在用bodyWithPolygonFromPath定义物理体的体积 我使用http dazchong com spritekit http dazchong com spritekit 获取所需的路径 但路径似乎不正确 我希望查看物理体路
  • Siri - 联系人搜索行为类似于 Skype 的音频通话

    我正在实现一个 VoIP 应用程序 我需要通过 Siri 发起呼叫 我能够通过 Siri 发起呼叫 但问题是 每次启动应用程序时 尽管联系人不在应用程序的联系人列表中 我不知道如何以及在哪里处理这个问题 我的意思是 如果应用程序没有像 Sk
  • iOS7上UITableViewCell显示白色背景且无法修改

    我已经实现了一个继承自的自定义表格视图单元格类UITableViewCell 表格视图包含背景图像 所以我希望单元格的背景是透明的 iOS7之前看起来很棒 然而 在 iOS7 中 单元格始终显示为白色背景 即使对于 Xcode7 2015
  • MFMailComposeViewController 立即关闭

    情况是 MFMailComposeViewController 将被呈现 我看到它已经完成了一半 但后来就被驳回了 这是错误 serviceViewControllerReady 错误 错误域 UIViewServiceInterfaceE
  • iCloud Drive 内用户选择的文件夹内的垃圾文件

    我的应用程序可在任何用户选择的文件夹内处理用户 txt 文件 创建 更改 删 除 我只是在内部存储书签以访问用户选择的文件夹和文件 现在 在 macOS Catalina 中 当源文件夹位于 iCloud Drive 内时 系统仍然允许我创
  • 在 Swift 2.0 中以横向模式使用 UIImagePickerController

    我正在编写一个仅限 LandScape 的 iPad 应用程序 我需要从库中拍照以发送数据库 但图像上传屏幕仅适用于纵向模式 如何将其更改为横向模式 我读过一些关于 UIPickerControllerDelegate 不支持横向模式的内容
  • 如何在 iPhone 中使用彩信发送音频?

    我瞪大了眼睛MMS在 iPhone 中 但我没有找到太多这方面的信息 大多数发现都与图像有关 我想使用发送音频MMS in iPhone using ios sdk 可以这样做吗 我有以下疑问MMS 如何识别所有MMS音频文件在iPhone
  • 从命令行减少 PNG 文件的位深度

    我可以从 CLI 执行什么命令或一系列命令来递归遍历目录树并将该树中所有 PNG 文件的位深度从 24bpp 减少到 16bpp 命令应该保留 alpha 层并且不应该增加 PNG 文件的大小 事实上减少会更好 我有一个基于 OSX 的系统
  • Bash touch - 非法选项 -d

    昨天我拍了很多照片 但我忘记更改相机中的时区 现在所有图片的修改日期都有错误 我想将特定目录中所有文件的修改日期更改为minus 10 hours bin sh for i in Users slick Desktop 100D5200 d
  • 在后台线程上搜索

    我试图在 iPhone 应用程序中搜索数千个对象 但是搜索严重滞后 每次击键后 UI 都会冻结 1 2 秒 为了防止这种情况 我必须在后台线程上执行搜索 我想知道是否有人有一些在后台线程上搜索的提示 我读了一点NSOperation并在网上
  • 在 iPhone 上搜索 PDF

    经过两天尝试使用 Quartz 从 PDF 中读取注释后 我成功做到了并且发布我的代码 https stackoverflow com questions 4080373 get pdf hyperlinks on ios with qua
  • UITableView 在单元格刷新时滚动到顶部

    我有一个 UITableView 其中一个单元格的大小是动态调整的 以适应其中的 UITextView 每当键入一个键时 单元格都会检查计算出的高度是否增加 就像换行符一样 因此它可以告诉表单元格的高度需要重新计算 我用这段代码做到了这一点
  • XCode std::thread C++

    对于学校的一个小项目 我需要创建一个简单的客户端 服务器结构 它将在路由器上运行 使用 openWRT 并且我试图在这个应用程序中使用线程做一些事情 我的 C 技能非常有限 所以我在internet https stackoverflow

随机推荐