Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone 当我试图释放分配有地址的NSString时,执行错误访问_Iphone_Objective C_Ios_Nsstring_Memory Management - Fatal编程技术网

Iphone 当我试图释放分配有地址的NSString时,执行错误访问

Iphone 当我试图释放分配有地址的NSString时,执行错误访问,iphone,objective-c,ios,nsstring,memory-management,Iphone,Objective C,Ios,Nsstring,Memory Management,我有一个试图释放的NSString 问题是,在某些情况下,当我试图释放它时,我会获得EXC\u BAD\u访问权限。NSString有一个分配给它的地址(我可以在底部页面看到它在0xABCDEF处分配了内存) 当有东西存在时,如何在重新释放的同时避免此问题?您可能已经对已释放的字符串调用了[release]。你是怎么分配的?当对象被释放或自动释放时,它不会自动设置为nil(0x0) [[NSString alloc]initWithSomething]需要释放调用 [NSString strin

我有一个试图释放的NSString

问题是,在某些情况下,当我试图释放它时,我会获得
EXC\u BAD\u访问权限。NSString有一个分配给它的地址(我可以在底部页面看到它在0xABCDEF处分配了内存)


当有东西存在时,如何在重新释放的同时避免此问题?

您可能已经对已释放的字符串调用了
[release]
。你是怎么分配的?当对象被释放或自动释放时,它不会自动设置为nil(0x0)

[[NSString alloc]initWithSomething]
需要释放调用


[NSString stringWithSomething]
并不像惯例那样,它是自动释放的。

您可能已经对已释放的字符串调用了
[release]
。你是怎么分配的?当对象被释放或自动释放时,它不会自动设置为nil(0x0)

[[NSString alloc]initWithSomething]
需要释放调用


[NSString stringWithSomething]
按照惯例,它不会自动释放。

您可以释放对象,但指向该对象的指针仍然可以有值。只是它是一个垃圾值(即a)

这就是为什么您会看到很多代码,例如:

[myObject release];
myObject nil;
它首先释放对象,然后将指针设置为
nil
。这样,发送给它的任何消息都将以静默方式失败(因为在Objective-C中向
nil
对象发送消息是安全的),而不是像应用程序那样崩溃


由于您正在检查指针,我怀疑您在内存管理方面做了一些奇怪的事情。不要。只需遵循,只释放您拥有的对象。

您可以释放对象,但指向该对象的指针仍然可以有值。只是它是一个垃圾值(即a)

这就是为什么您会看到很多代码,例如:

[myObject release];
myObject nil;
它首先释放对象,然后将指针设置为
nil
。这样,发送给它的任何消息都将以静默方式失败(因为在Objective-C中向
nil
对象发送消息是安全的),而不是像应用程序那样崩溃


由于您正在检查指针,我怀疑您在内存管理方面做了一些奇怪的事情。不要。只需按照说明操作,只释放您拥有的对象。

您能给出一些代码片段吗。。Bcz这可能是因为许多pbm,比如你没有保留,比如tatcheck,你是否会发布两次…你能给出一些代码片段吗。。Bcz这可能是因为许多pbm(如你)没有保留(如tatcheck)检查你是否释放了它两次….+1我通常创建一个宏,如下所示:
#定义SXRelease(obj)[obj release];obj=零
。对于
free()
#定义SXFree(ptr)free(ptr);ptr=NULL
。您有一个bug,将var设置为nil只是在掩盖它。最好启用mallocscribble进行开发构建并修复bug。+1我通常创建一个宏,如下所示:
#define SXRelease(obj)[obj release];obj=零
。对于
free()
#定义SXFree(ptr)free(ptr);ptr=NULL
。您有一个bug,将var设置为nil只是在掩盖它。最好启用Malloc Scribble进行开发构建并修复错误。在NSString的文档中找不到“initWithSomething”。在NSString的文档中找不到“initWithSomething”。