如何在ARC中刻意创建EXC_BAD_ACCESS?

时间:2013-11-28 10:49:17

标签: objective-c xcode5

我得到了EXC_BAD_ACCESS,我很沮丧。

我正在使用ARC。没有更多的发布和东西。据我所知,EXC_BAD_ACCESS根本不应该发生!

怎么会这样呢?

哦,好吧,如果我希望这种情况发生,是否有任何示例代码实际上会发生这种情况?

有谁知道?

3 个答案:

答案 0 :(得分:2)

ARC不保证您的程序没有错误,甚至没有错误的访问异常。很容易构建可能导致ARC中出现EXC_BAD_ACCESS的错误:

void mightOrMightNotCrash()
{
    __unsafe_unretained id a;
    [a self];
}

当然这是一个人为的例子,编译器可能会发出警告,但它说明你可以通过取消引用未初始化的内存来创建一个可能的错误访问。

以下是崩溃的示例:

__unsafe_unretained id a = (__bridge __unsafe_unretained id)(void *)1;
[a self];

当然,在ARC下的Objective-C中存在其他可能的错误访问原因,这些原因与消息传递或对象完全无关。好处是它们在机器上发生时相对容易理解:调试器会告诉您访问的位置以及程序的状态。

答案 1 :(得分:1)

来自:http://landonf.bikemonkey.org/2011/09/14

  // Random data
void *pointers[] = {NULL, NULL, NULL};
void *randomData[] = {"a", "b", pointers, "d", "e", "f"};

// A corrupted/under-retained/re-used piece of memory
struct {void *isa;} corruptObj = {randomData};

// Message an invalid/corrupt object.    
[(__bridge id)&corruptObj class];

答案 2 :(得分:1)

我在项目中找到了很多时间。但是很难为你找到一个:)

我试过并找到了这个:)

CFStringRef *str = "anoop"; 
NSLog(@"%@", str);

注意:如您所知,ARC无论是垃圾收集还是完全无错误访问已发布的对象。 ARC只是一个编译时功能,编译器会为您释放和自动释放。

为了获得exc_bad_access你可以创建任何对象并让对象释放然后你强制访问它,它将导致exc_bad_access。