菜鸟教程小白 发表于 2022-12-12 17:10:29

ios - OCMArg checkWithBlock 因 EXC_BAD_ACCESS 而崩溃


                                            <p><p>这是我的测试的样子:</p>

<pre><code>// In setUp:
self.APIClientMock = OCMClassMock();
OCMStub().andReturn(self.APIClientMock);

// In test method:
OCMVerify([self.APIClientMock POST:@&#34;invitations&#34; parameters:[OCMArg checkWithBlock:^BOOL(NSDictionary *parameters) {
    // Some parameters check is supposed to be here, but even simply returning YES doesn&#39;t work...
    return YES;
}] success: failure:]);
</code></pre>

<p>APIClient 是 AFHTTPSessionManager 的子类(来自 AFNetworking)。 </p>

<p>每次执行此测试时,都会出现如下 <code>EXC_BAD_ACCESS</code> 错误:</p>

<pre><code>EXC_BAD_ACCESS (code=1, address=0x7a0090020)
</code></pre>

<p>坦率地说,我对调试<code>EXC_BAD_ACCESS</code>错误并不是特别有经验,而且错误信息似乎也不是很有用</p>

<p>另外,奇怪的是,这只发生在我使用 <code>POST:parameters:success:failure:</code> 时,而不是它的 <code>GET</code> 对应项(它完全相同的参数)。</p>

<p>这会是 AFNetworking 内部的问题吗?</p>

<p><strong>编辑:</strong></p>

<p>启用僵尸对象进行测试,结果如下:</p>

<pre><code>*** -: message sent to deallocated instance 0x7fbd8306f280
</code></pre>

<p><strong>编辑 2:</strong></p>

<p>我将我的测试用例简化为以下总是重现崩溃的代码:</p>

<pre><code>#import &lt;AFNetworking.h&gt;
#import &lt;OCMock/OCMock.h&gt;
#import &lt;XCTest/XCTest.h&gt;

@interface ExampleTests : XCTestCase

@end

@implementation ExampleTests

- (void)sendRequesUsingSessionManager:(AFHTTPSessionManager *)sessionManager {
    NSDictionary *parameters = @{@&#34;param&#34;: @&#34;value&#34;};
    ;
}

- (void)testExample {
    id sessionManagerMock = OCMClassMock();
    ;
    OCMVerify([sessionManagerMock POST:@&#34;test&#34; parameters:[OCMArg checkWithBlock:^BOOL(NSDictionary *parameters) {
      return YES;
    }] success: failure:]);
}

@end
</code></pre></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p>这似乎是一个已知问题:</p>

<p> <a href="https://github.com/erikdoe/ocmock/issues/147" rel="noreferrer noopener nofollow">https://github.com/erikdoe/ocmock/issues/147</a> </p>

<p>我按照问题讨论中的建议做了以下解决方法:</p>

<ol>
<li>将 <code>OCMVerify</code> 更改为 <code>OCMExpect</code></li>
<li>在您的测试调用预期方法之前移动您的 <code>OCMExpect</code> 代码</li>
<li>最后调用<code>OCMVerifyAll</code></li>
</ol></p>
                                   
                                                <p style="font-size: 20px;">关于ios - OCMArg checkWithBlock 因 EXC_BAD_ACCESS 而崩溃,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/33773866/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/33773866/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: ios - OCMArg checkWithBlock 因 EXC_BAD_ACCESS 而崩溃