首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >尝试释放在初始化对象时借用的已分配内存,但收到Xcode警告

尝试释放在初始化对象时借用的已分配内存,但收到Xcode警告
EN

Stack Overflow用户
提问于 2010-08-12 01:30:16
回答 2查看 137关注 0票数 0

好了,我有了main.m程序代码,mvds建议我释放在创建新实例时从类中借用的已分配内存。

由于某些原因,当我尝试使用以下命令释放内存时

代码语言:javascript
复制
[converter free];

它给了我一个警告,告诉我转换器可能不会响应-free,一旦我完成了我的程序,当我试图循环回到开始,或者当我试图终止程序时,它会吐出一堆垃圾。

我认为这可能与我试图释放内存的位置有关,因为它可能是关闭的,或者与我设置的循环有关。

下面是我的main.m代码:

代码语言:javascript
复制
#import <Cocoa/Cocoa.h>
#import "class.h"

int main(int argc, char *argv[])
{
    int result;
    int prompt, prompt2;
    int loop = 1;
    double sourceTemp;

    while (loop == 1) {
        printf("\nWlecome to Bossverter, the one-stop shop for all of your temperature converting needs!  Please choose a source temperature scale:\n[1] Fahrenheit\n[2] Celsius\n[3] Kelvin\n[4] Rankine\n\n");

        result = scanf("%i", &prompt);

        if (result != 1)
            printf("Bossverter couldn't understand your input, Bossverter only needs one number!");

        else if (result == EOF)
            printf("Bossverter apologizes, Bossverter encountered an error when trying to read your input.");

        else if (result == 1)
        {
            printf("\nNow, please enter the temperature you would like to convert:\n\n");

            scanf("%lf", &sourceTemp);

            TemperatureConverter *converter = [[TemperatureConverter alloc] init];

            switch (prompt) 
            {
                case 1:
                    //end-user chooses Fahrenheit
                    [converter setFahrenheitValue:sourceTemp];
                    break;

                case 2:
                    //end-user chooses Celsius
                    [converter setCelsiusValue:sourceTemp];
                    break;

                case 3:
                    //end-user chooses Kelvin
                    [converter setKelvinValue:sourceTemp];
                    break;

                case 4:
                    //end-user chooses Rankine
                    [converter setRankineValue:sourceTemp];
                    break;
            }

            printf("\nNow, please choose a target temperature scale:\n[1] Fahrenheit\n[2] Celsius\n[3] Kelvin\n[4] Rankine\n\n");

            scanf("%i", &prompt2);

            char *scales[4] = { "Fahrenheit", "Celsius", "Kelvin", "Rankine" }; 

            switch (prompt2) 
            {
                case 1:
                    //end-user chooses Fahrenheit
                    printf("\n%lf degrees %s is %lf degrees Fahrenheit\n", sourceTemp, scales[prompt-1], [converter fahrenheitValue]);
                    break;

                case 2:
                    //end-user chooses Celsius
                    printf("\n%lf degrees %s is %lf degrees Celsius\n", sourceTemp, scales[prompt-1], [converter celsiusValue]);
                    break;

                case 3:
                    //end-user chooses Kelvin
                    printf("\n%lf degrees %s is %lf degrees Kelvin\n", sourceTemp, scales[prompt-1], [converter kelvinValue]);
                    break;

                case 4:
                    //end-user chooses Rankine
                    printf("\n%lf degrees %s is %lf degrees Rankine\n", sourceTemp, scales[prompt-1], [converter rankineValue]);
                    break;
            }

            printf("\nI'm glad you just Bossverted something.  Would you like to Bossvert again?\n[1] Yes!\n[2] No way man, I'm OUT!\n\n");

            scanf("%i", &loop);

            [converter free];

        }

    }



    return 0;
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-08-12 01:36:12

  1. 您没有NSAutoreleasePool -这很危险(而且可能是错误的)。
  2. 使用release,而不是free.
票数 2
EN

Stack Overflow用户

发布于 2010-08-12 01:37:24

free是一个C库调用,而不是一个NSObject方法。您要查找的消息是release

代码语言:javascript
复制
[converter release];
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3461137

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档