这是代码,[unosUpisa release]时不起作用;和[unosRazlike release];进入;
如何正确释放那些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];
}
答案 0 :(得分:0)
在关闭ViewController之前尝试移动调用。在ViewController已经发布时释放内存没有多大意义。
答案 1 :(得分:0)
首先,您将动态分配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];
}
答案 2 :(得分:0)
您必须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。
中设置它们的值答案 3 :(得分:0)
在Xcode 4中打开您的项目,转到产品菜单,然后选择分析。 Xcode将为您的文件添加蓝色注释标记,并提供有关此方法中可能存在的任何内存管理错误的完整文档。
阅读警告,修复它们,并确保您理解它们以供将来参考。