__strong NSString *yourString = [[NSString alloc] initWithUTF8String:"string 1"]; __weakNSString *myString = yourString; __unsafe_unretained NSString *theirString = myString; yourString = nil; NSLog(@"yourString:%p --- :%@",yourString,yourString); NSLog(@"myString:%p --- :%@",myString,myString); NSLog(@"theirString:%p --- :%@",theirString,theirString);
为什么这里输出结果是
yourString:0x0 --- :(null) myString:0x6861220 --- :string 1 theirString:0x6861220 --- :string 1
按照arc的描述应该出现crash的,为什么没有?
这里只会出现内存泄漏,不会crash。
因为系统默认为内存是yourString创建的,系统会在某个时候去调用[yourString release]释放yourString。后来yourString被置为了nil.调用[nil release]是不会crash的。但是这里yourString开始alloc的这段内存已经不会给释放了,所以内存泄漏。
至于其他两个指针,不会对内存有影响。
你输出结果能打印出这些?这么牛逼?应该会被crash的,你这原因可能时xcode问题,并没有开启实时监测僵尸对象,另外,我觉得会在最后一行崩溃,野指针错误,因为,当对象释放时,使用__weak修饰的指针变量会指向nil,而__unsafe_unretained 不会指nil,所以,出现野指针错误
按照arc的描述应该出现crash的,为什么没有?
因为你用了NSString,你换成其他的对象,比如ViewController试试。
我按照你写的奔溃了
分析一下原因:没有强指针指向的对象会自动释放
__strong NSString *yourString = [[NSString alloc] initWithUTF8String:"string 1"];//创建一个字符串
__weakNSString *myString = yourString;//一个弱指针指向youstring,这时[[NSString alloc] initWithUTF8String:"string 1"]有两个指针指向,一个强指针,一个弱指针
__unsafe_unretained NSString *theirString = myString;//
yourString = nil;//youString置为nil,[[NSString alloc] initWithUTF8String:"string 1"];没有强指针指向这时就释放了
那么__weakNSString *myString = yourString;myString指针指向的地址也不存在,释放掉了
同理theirString也释放了,在调用一个释放掉的指针就会出现内存泄露