关于在函数中分配和释放对象的问题

时间:2011-07-19 14:07:01

标签: iphone function object release

这是代码,[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];
}

4 个答案:

答案 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将为您的文件添加蓝色注释标记,并提供有关此方法中可能存在的任何内存管理错误的完整文档。

阅读警告,修复它们,并确保您理解它们以供将来参考。