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
释放内存和指针本身?在objective-c中_Objective C_Pointers_Memory Management - Fatal编程技术网

释放内存和指针本身?在objective-c中

释放内存和指针本身?在objective-c中,objective-c,pointers,memory-management,Objective C,Pointers,Memory Management,我有点困惑,当我们释放指针或对指针使用nil时,它会释放内存。但是指针本身呢?它指向一个不再存在的对象,那么指针是否会自动删除?这是否意味着dealloc同时释放内存和指针本身 谢谢指针是一个局部变量,表示内存中的地址,而不是对象。没有什么可以释放的 例如: int i = 1; NSSomething *object = [[NSSomething alloc] init]; 现在堆栈中有两个局部变量,一个是int类型,另一个是指向NSSomething的指针类型。堆中还有一个新的NSSom

我有点困惑,当我们释放
指针
或对指针使用
nil
时,它会释放内存。但是指针本身呢?它指向一个不再存在的对象,那么指针是否会自动删除?这是否意味着
dealloc
同时释放内存和指针本身


谢谢

指针是一个局部变量,表示内存中的地址,而不是对象。没有什么可以释放的

例如:

int i = 1;
NSSomething *object = [[NSSomething alloc] init];

现在堆栈中有两个局部变量,一个是
int
类型,另一个是
指向NSSomething
的指针类型。堆中还有一个新的
NSSomething
实例。如果您现在简单地
return
,您的
i
object
变量将超出范围并消失,但是堆中的
NSSomething
实例将永远存在。为了避免这种情况,您必须先
释放
(或
自动释放
),然后才能
从函数返回

指针是表示内存中地址的局部变量,而不是对象。没有什么可以释放的

例如:

int i = 1;
NSSomething *object = [[NSSomething alloc] init];

现在堆栈中有两个局部变量,一个是
int
类型,另一个是
指向NSSomething
的指针类型。堆中还有一个新的
NSSomething
实例。如果您现在简单地
return
,您的
i
object
变量将超出范围并消失,但是堆中的
NSSomething
实例将永远存在。为了避免这种情况,您必须在从函数返回之前
释放它(或
自动释放它)。

指针本身在返回时被堆栈帧擦除(有点像程序集调用RET,更像堆栈大括号{},它实际打开并关闭堆栈帧)


对于指针本身,您无需担心。如果确实需要,可以指定指针(强制转换为void*),并在将id*设置为nil后将其设置为NULL。(当传递objective-c消息时,立即设置NULL会导致错误的访问错误)。

指针本身在返回时被堆栈帧擦除(有点像程序集调用RET,更像堆栈大括号{},它实际打开{并关闭}堆栈帧)


对于指针本身,您无需担心。如果确实需要,可以指定指针(强制转换为void*),并在将id*设置为nil后将其设置为NULL。(当传递objective-c消息时,立即设置NULL会导致错误的访问错误)。

即使对象已被释放,指针仍指向该对象的地址。通常,在释放指针指向的上一个对象后,您希望将指针设置为nil或其他对象。如果使用的是objective-c属性,则连接到该属性的指针将自动设置为nil

即使对象已被释放,指针仍指向该对象的地址。通常,在释放指针指向的上一个对象后,您希望将指针设置为nil或其他对象。如果使用的是objective-c属性,则连接到该属性的指针将自动设置为nil

谢谢,我们可以对setter使用
nil
,而不是
release
,以便setter负责释放对象并将指针传递给nil吗?到目前为止,在我读过的几个例子中,我只看到setter使用了“release”,但没有看到太多的“nil”。我仍然释放对象,然后将属性设置为nil,但我建议使用ArcThank,我们是否可以对setter使用
nil
,而不是
release
,所以setter负责释放对象并将指针传递给nil?到目前为止,在我读过的几个例子中,我只看到了使用“release”,但没有看到太多的“nil”,setterI仍然释放对象,然后将属性设置为nil,但是我建议使用ArcRadu,因此我们可能有一个指向任何地方的指针,如果我们使用这个指针,它可能会使应用程序崩溃,这是正确的吗?我通常只看到retain/release,而没有在指针上使用“nil”,所以我想知道这是一个小错误,还是正常的方法。@Paul,是的,的确,这是一种“防御编程”技术。如果您将指针设置为nil,那么如果您犯了错误并尝试使用它,应用程序将不会崩溃,因为向nil发送消息没有任何作用,而向已发布的对象发送消息会导致未定义的行为(=在您最不经意的时候随机崩溃,通常是在应用程序发布之后)。谢谢,我们是否仍应在dealoc中使用“nil”?dealloc在应用程序停止时启动,那么有什么危险呢?谢谢Radu,所以我们可能有一个指向任何地方的指针,如果我们使用这个指针,它可能会使应用程序崩溃,对吗?我通常只看到retain/release,而没有在指针上使用“nil”,所以我想知道这是一个小错误,还是正常的方法。@Paul,是的,的确,这是一种“防御编程”技术。如果您将指针设置为nil,那么如果您犯了错误并尝试使用它,应用程序将不会崩溃,因为向nil发送消息没有任何作用,而向已发布的对象发送消息会导致未定义的行为(=在您最不经意的时候随机崩溃,通常是在应用程序发布之后)。谢谢,我们是否仍应在dealoc中使用“nil”?dealloc在应用程序停止时启动,那么有什么危险呢?