- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我创建了一个实现一些方法的类。这些方法由另一个类调用,并通过 NSBlockOperation 进行管理。
我的 NSBlockOperation 工作正常,我在尝试计算变量时遇到问题:
EXC_BAD_ACCESS
我在互联网上做了很多研究,this是最接近我的问题的一个。我试着像 sugerito 那样做,但你遇到了同样的问题。
你有什么建议吗?
编辑:
这是堆栈跟踪:
2015-05-09 15:24:45.976 OutParameters[12326:743087] Stack trace : (
0 OutParameters 0x000000010e5d6602 -[ListOperation _method1:] + 194
1 OutParameters 0x000000010e5d646f __25-[ListOperation method1:]_block_invoke + 95
2 Foundation 0x000000010e74257f __NSBLOCKOPERATION_IS_CALLING_OUT_TO_A_BLOCK__ + 7
3 Foundation 0x000000010e6830b2 -[NSBlockOperation main] + 98
4 Foundation 0x000000010e665774 -[__NSOperationInternal _start:] + 645
5 Foundation 0x000000010e665383 __NSOQSchedule_f + 184
6 libdispatch.dylib 0x00000001113f4614 _dispatch_client_callout + 8
7 libdispatch.dylib 0x00000001113db6a7 _dispatch_queue_drain + 2176
8 libdispatch.dylib 0x00000001113dacc0 _dispatch_queue_invoke + 235
9 libdispatch.dylib 0x00000001113de3b9 _dispatch_root_queue_drain + 1359
10 libdispatch.dylib 0x00000001113dfb17 _dispatch_worker_thread3 + 111
11 libsystem_pthread.dylib 0x0000000111761637 _pthread_wqthread + 729
12 libsystem_pthread.dylib 0x000000011175f40d start_wqthread + 13
)
修改后的代码:
- (IBAction)testCallMethod:(id)sender {
NSString * output;
[self.listOperationObj method1:&output];
NSLog(@"Output: %@", output);
}
和
@interface ListOperation : NSObject
-(void)method1:(NSString**)output;
@end
#define MAX_OPERATIONS 10
//define a log-level
static int logLevel = CSLOG_LEVEL_INFO;
@interface ListOperation ()
// Tail used to synchronize the methods
@property NSOperationQueue *queue;
@end
#pragma mark - Public methods
@implementation ListOperation
- (id)init {
self = [super init];
if(self) {
_queue = [NSOperationQueue new];
if(_queue) {
[_queue setMaxConcurrentOperationCount:1];
}else {
NSLog(@"TokenMgr creation failed: error creating operation queue");
self = nil;
}
}
return self;
}
-(void)method1:(NSString *__autoreleasing *)output{
LOGFSTART
if([self _isQueueFull] == FALSE) {
WEAK
NSBlockOperation *operation = [NSBlockOperation blockOperationWithBlock:^{
STRONG
[strongSelf _method1:output];
}];
[self.queue addOperation:operation];
[operation waitUntilFinished];
}
else {
LOGE(@"TokenMgr's queue is full, aborting operation");
}
LOGFEND
}
#pragma mark - private methods
-(void)_method1:(NSString *__autoreleasing *)output{
std::string testString = "try put string";
*output = [NSString stringWithUTF8String:testString.c_str()];
}
- (BOOL) _isQueueFull {
return self.queue.operationCount > MAX_OPERATIONS;
}
@end
如果我反复按下按钮,这个更改会给我同样的错误。
最佳答案
眼前的问题与方 block 无关。你有一个代码片段说:
- (IBAction)testCallMethod:(id)sender {
NSString *__autoreleasing * output;
[self.listOperationObj method1:output];
NSLog(@"Output: %@", *output);
}
那是行不通的,因为 output
不会指向有效的内存地址,当您尝试使用 *output = ...
取消引用未初始化的指针时,它会崩溃。
相反,那应该是:
- (IBAction)testCallMethod:(id)sender {
NSString *output;
[self.listOperationObj method1:&output];
NSLog(@"Output: %@", output);
}
现在 output
引用了一个真正的 NSString *
指针,您可以用对对象的引用来填充它。
还有第二个更深层次的问题,即对操作中实例化的对象使用 * __autoreleasing *
引用。操作有自己的自动释放池,因此在 testCallMethod
中使用对象时会出现竞争条件。
相反,人们通常使用完成 block 将数据传回给调用者。因此:
- (IBAction)testCallMethod:(id)sender {
[self.listOperationObj method2:^(NSString *output) {
NSLog(@"Output: %@", output);
}];
}
和
- (void)method2:(void (^)(NSString *))completionHandler {
LOGFSTART
if([self _isQueueFull] == FALSE) {
WEAK
NSBlockOperation *operation = [NSBlockOperation blockOperationWithBlock:^{
STRONG
[strongSelf _method2:completionHandler];
}];
[self.queue addOperation:operation];
// [operation waitUntilFinished]; // not needed any more
}
else {
LOGE(@"TokenMgr's queue is full, aborting operation");
}
LOGFEND
}
-(void)_method2:(void (^)(NSString *))completionHandler {
std::string testString = "try put string";
NSString *output = [NSString stringWithUTF8String:testString.c_str()];
completionHandler(output);
}
请注意,顺便说一下,这也解决了您的示例的另一个问题,即您必须在其中放置一个 waitUntilFinished
调用。您永远不应从主线程调用 waitUntilFinished
。如果您像上面那样使用完成 block ,则不再需要。
关于ios - NSBlockOperation EXC_BAD_ACCESS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30140318/
我遇到了一些应用程序崩溃的问题,我需要一些指导才能修复它。我有一个带有主视图和模态视图的应用程序,非常类似于默认的翻转实用模板。当我第一次运行该应用程序时,一切都运行良好,包括模态视图。但是,当我返回
UPDATE: I updated the correction of my definition of Realm, I still get the error. I'm using Swi
我正在尝试用带有c的sqlite3创建一个CGI可执行文件。但我收到错误exc_badd_access,我不知道问题出在哪里。我的代码是:。main.c。sqlite.h。Sqlite.c。Confi
我正在尝试用带有c的sqlite3创建一个CGI可执行文件。但我收到错误exc_badd_access,我不知道问题出在哪里。我的代码是:。Main.c。sqlite.h。Sqlite.c。Confi
我正在尝试暂停 AVAudioPlayer如果当前正在播放。当我调试我的代码并检查时 AVAudioPlayer ,我看是分配的。当我尝试访问它的方法/属性(即 myAudioPlayer isPla
我正在使用 xcode 用 C 语言编写这个简单的程序。 #include int main() { double A[200][200][2][1][2][2]; int B[2
这是我得到的错误 Thread 1:EXC_BAD_ACCESS (code=2, address=0xb7ffffc) 在这条线上 [[NSNotificationCenter defaultCen
我的 iPhone 应用程序出现问题,出现 EXC_BAD_ACCESS,出现一些内存泄漏,但这些问题现已修复,所以我不确定发生了什么。我意识到我没有提供很多信息,但我真的不知道发生了什么。 打开初始
//adds a button to scroll list -(void) addNode:(NSString *) atitle{ UIButton *btn = [UIButton
我几乎完成了我的第一个应用程序,但我遇到了一个奇怪的 EXC_BAD_ACCESS,这种情况几乎一直在发生。 这是跟踪: #0 0x02adba93 in objc_msgSend #1 0x0702
我一直在研究核心数据,并开始编写一些方法来查询不同日期范围的数据。我的核心数据模型非常简单(名为 Smoke 的实体,具有一个字段 - 时间戳(日期类型)。 当我执行代码时,会返回正确的计数,但出现自
我有以下代码: ABAddressBookRef ab; ab = ABAddressBookCreate(); int len = (int) ABAddressBookGetPersonCount
希望有人可以帮助我调试这个问题,因为 EXC_BAD_ACCESS 是我收到的唯一错误。我也尝试过打开 NSZombieEnabled,但据我所知,没有获得更多信息。 问题。我有四个实体: A ->
我正在 tableView 上加载自定义单元格,并在 tableView 中返回 50 行。一些行数显示在表格 View 中,但是当滚动表格 View 时,我的自定义单元格不显示,并且出现错误 "EX
我正在尝试使用 NSLog 来打印控制台消息。问题是有时我在调用它时收到“EXC_BAD_ACCESS”错误 -(void)willRotateToInterfaceOrientation:(UIIn
这是我使用音频队列生成噪音的代码: http://pastebin.com/Kn8GU72J 问题是我的代码生成了 EXC_BAD_ACCESS。问题似乎出在作业中 MAAudioManage
我正在开发适用于 iOS 的 OpenGL ES 2 应用程序。今天早上(没有更改任何代码)我开始从 sgxTextureGetImageRowBytes 抛出 EXC_BAD_ACCESS。 #0
我在这里完全迷路了。 我的应用程序中有Google Analytics(分析),可查看有多少用户从UITableView进入detailview 我在viewDidLoad方法中添加了Google A
我是 Cocoa 新手,正在编写一个简单的应用程序来学习使用 Core Data,但它因 EXC_BAD_ACCESS 而崩溃。尝试了几种方法,但尚未找到解决方案。正如我所说,我对 Cocoa 的经验
以下代码使应用程序崩溃,我不知道为什么。它不规则地崩溃,这意味着有时单击一行时 ImageView 可以显示 30 次,有时当我选择一行时它会第二次崩溃。 仅供引用:事件指示器、操作表和变量 imag
我是一名优秀的程序员,十分优秀!