关于在函数中分配和释放对象的问题
Posted
技术标签:
【中文标题】关于在函数中分配和释放对象的问题【英文标题】:Question about allocating and releasing an object in a function 【发布时间】:2011-07-19 14:07:01 【问题描述】:这是代码,在[unosUpisa release]时不起作用;和 [unosRazlike 版本];已输入;
如何正确释放那些 unosUpisa 和 unosRazlike 对象?
-(IBAction) padIliStilja: (id) sender
NSNumber *unosUpisa = [[NSNumber alloc] init];
NSNumber *unosRazlike = [[NSNumber alloc] init];
if ([sender tag] == 1)
unosUpisa = [NSNumber numberWithInt: 162 + [Data variables].zvanja];
unosRazlike = [NSNumber numberWithInt: 0];
else if ([sender tag] == 2)
unosRazlike = [NSNumber numberWithInt: 252 + [Data variables].zvanja];
unosUpisa = [NSNumber numberWithInt: 0];
if ([Data variables].upisZaMi == NO)
[[Data variables].rezultatMi addObject: unosUpisa];
[[Data variables].rezultatVi addObject: unosRazlike];
else
[[Data variables].rezultatVi addObject: unosUpisa];
[[Data variables].rezultatMi addObject: unosRazlike];
[self dismissModalViewControllerAnimated: NO];
[unosUpisa release];
[unosRazlike release];
【问题讨论】:
如果您要将unosUpisa
和unosRazlike
重新分配给不同的自动释放变量,为什么要分别初始化/分配它们?
【参考方案1】:
您必须release
您拥有的每个对象(您保留、复制或初始化/分配)。
最后释放对象的方式是正确的,但是,这里unosRazlike = [NSNumber numberWithInt: 0];
,你分配了另一个值unosRazlike
,没有释放前一个值,这是一个泄漏。
此外,使用这种方法,您应该保留您的对象。
所以:
unosRazlike = ...
// first
[unosRazlike release];
unosRazlike = [[NSNumber numberWithInt: 0] retain];
// ...
[unosRazlike release];
编辑
-(IBAction) padIliStilja: (id) sender
// this is no matter
NSNumber *unosUpisa = [[NSNumber alloc] init];
NSNumber *unosRazlike = [[NSNumber alloc] init];
if ([sender tag] == 1)
// don't forget to release them !
[unosUpisa release]; [unosRazlike release];
// and to retain (numberWithInt returns autoreleased object
unosUpisa = [[NSNumber numberWithInt: 162 + [Data variables].zvanja] retain];
unosRazlike = [[NSNumber numberWithInt: 0] retain];
else if ([sender tag] == 2)
// same again
[unosUpisa release]; [unosRazlike release];
// and to retain (numberWithInt returns autoreleased object
unosRazlike = [[NSNumber numberWithInt: 252 + [Data variables].zvanja] retain];
unosUpisa = [[NSNumber numberWithInt: 0] retain];
if ([Data variables].upisZaMi == NO)
[[Data variables].rezultatMi addObject: unosUpisa];
[[Data variables].rezultatVi addObject: unosRazlike];
else
[[Data variables].rezultatVi addObject: unosUpisa];
[[Data variables].rezultatMi addObject: unosRazlike];
[self dismissModalViewControllerAnimated: NO];
[unosUpisa release];
[unosRazlike release];
但只是一个想法...为什么要初始化“空白”数字对象,如果您在 if 或 else 部分设置值?
只需声明它们
NSNumber *unosRazlike, *unosUpisa;
并在 if/else 中设置它们的值。
【讨论】:
我试图在代码开头声明它们为: NSNumber *unosRazlike, *unosUpisa;但我得到 SIGABRT 这是 pastebin 中的代码:pastebin.com/Z1GFiK0X @Wikiboo - 错误在第 7/8、12/13 行,numberWithInt:
是类方法!改用initWithInt:
【参考方案2】:
在关闭 ViewController 之前尝试移动调用。当您的 ViewController 已经被释放时,释放该内存没有多大意义。
【讨论】:
是的,我试过这样,我试图在解雇后把它放出来【参考方案3】:首先你是动态分配 NSNumber 然后在你的条件下
if ([sender tag] == 1)
unosUpisa = [NSNumber numberWithInt: 162 + [Data variables].zvanja];
unosRazlike = [NSNumber numberWithInt: 0];
else if ([sender tag] == 2)
unosRazlike = [NSNumber numberWithInt: 252 + [Data variables].zvanja];
unosUpisa = [NSNumber numberWithInt: 0];
您正在堆栈上分配 NSNumber,从而失去与动态分配的 NSNumber 的连接。
更好的方法是
if ([sender tag] == 1)
unosUpisa = [[NSNumber alloc] initWithInt: 162 + [Data variables].zvanja];
unosRazlike = [[NSNumber alloc] initWithInt: 0];
else if ([sender tag] == 2)
unosRazlike = [[NSNumber alloc] initWithInt: 252 + [Data variables].zvanja];
unosUpisa = [[NSNumber alloc] initWithInt: 0];
【讨论】:
我输入了 NSNumber *unosUpisa;和 NSNumber *unosRazlike;然后尝试了你的代码,但我得到了一个 NSException 具体说了什么? 程序接收信号“SIGABRT”,这是 unosRazlike = [[NSNumber alloc] numberWithInt: 252 + [Data variables].zvanja]; 您确定可以访问[Data variables].zvanja吗? 是的,它可以在另一个文件中使用,这里是整个代码:pastebin.com/Z1GFiK0X【参考方案4】:在 Xcode 4 中打开您的项目,进入 Product 菜单并选择 Analyze。 Xcode 将为您的文件添加蓝色注释标记,并为您在此方法中可能遇到的任何内存管理错误提供完整的文档。
阅读警告,修复它们,并确保您理解它们以供将来参考。
【讨论】:
以上是关于关于在函数中分配和释放对象的问题的主要内容,如果未能解决你的问题,请参考以下文章