Iphone 我需要释放局部变量吗?

Iphone 我需要释放局部变量吗?,iphone,objective-c,memory-management,Iphone,Objective C,Memory Management,在我的应用程序中,我在本地声明了一个N错误: NSError *error; 我是用dealloc方法发布它还是需要用我声明的方法发布它?你需要在本地发布它——假设你通过alloc/new/copy或者保留它。(如果您只是从其他地方获得,而没有分配或保留,那么它就不属于您,您根本不应该发布。) 否则,一旦它超出本地范围,您将无法访问指针,对象将泄漏。您需要在本地释放它——假设您通过alloc/新建/复制或保留它。(如果您只是从其他地方获得,而没有分配或保留,那么它就不属于您,您根本不应该发布。

在我的应用程序中,我在本地声明了一个N错误:

NSError *error;

我是用dealloc方法发布它还是需要用我声明的方法发布它?

你需要在本地发布它——假设你通过
alloc
/
new
/
copy
或者
保留它。(如果您只是从其他地方获得,而没有分配或保留,那么它就不属于您,您根本不应该发布。)


否则,一旦它超出本地范围,您将无法访问指针,对象将泄漏。

您需要
在本地释放它
——假设您通过
alloc
/
新建
/
复制
保留它。(如果您只是从其他地方获得,而没有分配或保留,那么它就不属于您,您根本不应该发布。)

否则,一旦它超出本地范围,您将无法访问指针,对象将泄漏。

请阅读,内存管理是您应该完全理解的内容。(这并不难。)如果在方法中声明变量,则在
dealloc
中没有指向它的指针,因此不能在那里释放它–只能在它超出范围之前释放它。另一个问题是你是否应该发布它。这取决于它是基于堆栈的、自动释放的还是保留的变量:

float foo[] = {1, 2, 3}; // stack-based, no releasing necessary
NSString *foo = [NSString stringWithFormat:…]; // autoreleased, you must not release it
NSString *foo = [[NSString alloc] initWith…]; // retained, you must release it
请阅读,内存管理是你应该完全理解的东西。(这并不难。)如果在方法中声明变量,则在
dealloc
中没有指向它的指针,因此不能在那里释放它–只能在它超出范围之前释放它。另一个问题是你是否应该发布它。这取决于它是基于堆栈的、自动释放的还是保留的变量:

float foo[] = {1, 2, 3}; // stack-based, no releasing necessary
NSString *foo = [NSString stringWithFormat:…]; // autoreleased, you must not release it
NSString *foo = [[NSString alloc] initWith…]; // retained, you must release it

你需要在本地发布它。因为在dealloc方法中,我们释放类变量或类数据成员,以及在整个实现文件中使用的那些变量(如外部变量)。

您需要在本地释放它。因为在dealloc方法中,我们释放类变量或类数据成员,以及在整个实现文件中使用的那些变量(如extern变量)。

这不是一个好的方法。如果您拥有对象,您只需要在本地释放它,这通常不是
NSError
的情况。但是您不能使用dealloc方法释放它,因为在那里无法访问它。最好用本地方法发布它。当出现错误时,将使用As NSError。所以这完全取决于情况。问题有两个部分:在哪里释放和是否释放。你说在本地发布(这很好),但剩下的一点是你几乎根本不需要发布
NSError
值,因为它们是自动释放的。尝试在本地发布后,应用程序会被中断。其他本地声明的对象也是如此。似乎超出了NSFileManager、NSError、NSArray和NSString。如果在本地声明它们,则只需释放NSFileManager。@sregorcinimod,区别不在于作用域(本地变量与实例变量),而在于内存管理(保留对象与自动删除对象)。学习正确的内存管理(如我链接的指南中所述)对你来说是至关重要的,否则你会受到影响。这不是一个好的说法。如果您拥有对象,您只需要在本地释放它,这通常不是
NSError
的情况。但是您不能使用dealloc方法释放它,因为在那里无法访问它。最好用本地方法发布它。当出现错误时,将使用As NSError。所以这完全取决于情况。问题有两个部分:在哪里释放和是否释放。你说在本地发布(这很好),但剩下的一点是你几乎根本不需要发布
NSError
值,因为它们是自动释放的。尝试在本地发布后,应用程序会被中断。其他本地声明的对象也是如此。似乎超出了NSFileManager、NSError、NSArray和NSString。如果在本地声明它们,则只需释放NSFileManager。@sregorcinimod,区别不在于作用域(本地变量与实例变量),而在于内存管理(保留对象与自动删除对象)。学习正确的内存管理(如我链接的指南中所述)对你来说至关重要,否则你会受苦的。谢谢-这是我需要的答案谢谢-这是我需要的答案