के साथ कॉलबैक क्रैश क्रैश करें मेरे पास एक कस्टम NSOperation सबक्लास है जिसका उपयोग मैं HTTP अनुरोध करने के लिए करता हूं। यह एक ब्लॉक-आधारित कॉलबैक स्वीकार करता है जिसे एनएसओपरेशन पूरा होने पर निष्पादित किया जाता है। सब कुछ तदनुसार काम करता है, लेकिन मेरा पूरा कॉलबैक निष्पादित करने का प्रयास करते समय मुझे एक अजीब, अड़चन दुर्घटना का सामना करना पड़ रहा है। मैंने बहुत सारे ब्लॉक-आधारित EXEC_BAD_ACCESS समस्याओं को पढ़ा है जो अतिरिक्त तरीकों से इसे पार करते समय ब्लॉक को सही ढंग से कॉपी नहीं कर रहे हैं।EXC_BAD_ACCESS
मुझे विश्वास है कि मेरी समस्या से संबंधित है कि मैं ब्लॉक का उपयोग कैसे कर रहा हूं। मैं नीचे अपने आवेदन के लिए एक मानक उपयोग केस शामिल करेंगे। मेरे मुद्दे की जड़ एक स्वामित्व गलतफहमी की संभावना है जहां ब्लॉक का संबंध है।
// Perform a HTTP request to a specified endpoint and declare a callback block
[self performRequestToEndpoint:@"endpoint" completion:^(HTTPResponse *response) {
NSLog(@"Completed with response: %@", response);
}];
// A helper function to avoid having to pass around too many parameters
- (void)performRequestWithEndpoint:(NSString *)endpoint completion:(void (^)(HTTPResponse *response))completionBlock
{
// Make our HTTP request and callback our original completion block when done
[self requestWithMethod:@"GET" path:endpoint completion:^(HTTPResponse *response) {
if(![response error])
{
// Call our original completion block
completionBlock(response);
}
];
}
जब एक कॉलबैक ब्लॉक requestWithMethod के माध्यम से असाइन किया गया है: पथ: पूरा होने: विधि, यह बहुत तरह की नकल की है:
- (void)callCompletionBlockWithResponse:(id)response
{
if(self.operationCompletionBlock && !self.isCancelled)
{
self.operationCompletionBlock(response); // crashes here (intermittently)
}
[self finish];
}
अटैच किया गया:
@property (nonatomic, copy) void (^operationCompletionBlock)(HTTPResponse *response);
यहाँ दुर्घटना के बात है नीचे स्टैक ट्रेस है:
* thread #1: tid = 0x2403, 0x0000000000000000, stop reason = EXC_BAD_ACCESS (code=1, address=0x0)
frame #0: 0x0000000000000000
frame #1: 0x00007f946b53ed01
frame #2: 0x0000000102da7cf7 Project`-[HTTPRequest callCompletionBlockWithResponse:] + 215 at HTTPRequest.m:402
frame #3: 0x0000000102da79e7 Project`__44-[HTTPRequest connectionDidFinishLoading:]_block_invoke_0 + 423 at HTTPRequest.m:381
frame #4: 0x00007fff956fea86 libdispatch.dylib`_dispatch_call_block_and_release + 18
frame #5: 0x00007fff957008f6 libdispatch.dylib`_dispatch_main_queue_callback_4CF + 308
frame #6: 0x00007fff8f07ce7c CoreFoundation`__CFRunLoopRun + 1724
frame #7: 0x00007fff8f07c486 CoreFoundation`CFRunLoopRunSpecific + 230
frame #8: 0x00007fff94f1a4d3 HIToolbox`RunCurrentEventLoopInMode + 277
frame #9: 0x00007fff94f21781 HIToolbox`ReceiveNextEventCommon + 355
frame #10: 0x00007fff94f2160e HIToolbox`BlockUntilNextEventMatchingListInMode + 62
frame #11: 0x00000001032a6e31 AppKit`_DPSNextEvent + 659
frame #12: 0x00000001032a6735 AppKit`-[NSApplication nextEventMatchingMask:untilDate:inMode:dequeue:] + 135
frame #13: 0x00000001032a3071 AppKit`-[NSApplication run] + 470
frame #14: 0x000000010351f244 AppKit`NSApplicationMain + 867
frame #15: 0x0000000102d69512 Project`main + 34 at main.m:13
frame #16: 0x0000000102d694e4 Project`start + 52
आप वास्तव में इसे सेट करने के लिए संपत्ति का उपयोग कर रहे हैं, है ना? जैसे 'self.operationClock =lock_lockBlock; 'इसे इंस्टेंस वैरिएबल पर सीधे सेट नहीं कर रहा है? जैसे 'ऑपरेशन कॉम्प्लेक्शनब्लॉक = समापनब्लॉक; ' – newacct
हाँ! यह बिल्कुल ठीक है जैसा आपने वर्णन किया है 'self.operationCompletionBlock = completBlock; ' – ndg
कुछ भी गलत नहीं दिख रहा है। शायद आपको अनुरोध दिखाना चाहिए विधि: पथ: समापन: विधि – newacct