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

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];

【问题讨论】:

如果您要将unosUpisaunosRazlike 重新分配给不同的自动释放变量,为什么要分别初始化/分配它们? 【参考方案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 将为您的文件添加蓝色注释标记,并为您在此方法中可能遇到的任何内存管理错误提供完整的文档。

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

【讨论】:

以上是关于关于在函数中分配和释放对象的问题的主要内容,如果未能解决你的问题,请参考以下文章

在复制构造函数中分配和初始化

关于__weak 和 __strong配和使用的原因

ORACLE:在同一条语句中分配和检查

Xcode 中的内存管理

在文本字段中分配和辞职第一响应者

有没有办法在 SKSpriteNode 中分配和调用变量?