Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/35.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
iPhone内存管理_Iphone_Memory - Fatal编程技术网

iPhone内存管理

iPhone内存管理,iphone,memory,Iphone,Memory,我正要出丑,但我注意到这里有很多友好和耐心的人,所以我就试一下: 我正在开发一个iPhone应用程序,其中包含一个汽车评论数据库。我希望用户能够通过电子邮件共享评论。因此,当他/她在应用程序中发现一辆有趣的汽车时,他/她会按下一个按钮,应用程序就会通过iPhone的Mail.app编写一封电子邮件 现在。我是个新手,我必须承认我对iPhone上的内存管理不是很熟悉。我编写的代码,这个特定的邮件方法,在退出应用程序时会显示可怕的“ProgramReceived signal:“EXC_BAD_AC

我正要出丑,但我注意到这里有很多友好和耐心的人,所以我就试一下:

我正在开发一个iPhone应用程序,其中包含一个汽车评论数据库。我希望用户能够通过电子邮件共享评论。因此,当他/她在应用程序中发现一辆有趣的汽车时,他/她会按下一个按钮,应用程序就会通过iPhone的Mail.app编写一封电子邮件

现在。我是个新手,我必须承认我对iPhone上的内存管理不是很熟悉。我编写的代码,这个特定的邮件方法,在退出应用程序时会显示可怕的“ProgramReceived signal:“EXC_BAD_ACCESS”消息。谷歌搜索表明这是内存管理不好的结果

在我对这件事不太了解的情况下,我开始显式初始化,然后像疯子一样释放所有临时变量。然而,“EXC_BAD_ACCESS”不断出现

这里有趣的一点是:一旦我杀死我的应用程序,构建的URL仍然会触发Mail.app,并愉快地为我创建电子邮件

请考虑下面的示例代码,并向我开枪。

- (IBAction) sendCartoFriend
{
    CarAppDelegate *appDelegate = (CarAppDelegate *)[[UIApplication sharedApplication] delegate];

    //Read the html template
    NSString *resourcePath = [[NSBundle mainBundle] resourcePath];
    NSString *emailFile = [resourcePath stringByAppendingPathComponent:@"MailDummy.html"];
    NSMutableString *eMailRaw = [[[NSMutableString alloc] initWithContentsOfFile:emailFile]autorelease];

    //set the variables
    NSString *carNamePlaceholder = [[NSString alloc] initWithString:@"CarTitle"];
    NSString *carName = [[NSString alloc] initWithString:car.shortname];
    [eMailRaw replaceOccurrencesOfString:carNamePlaceholder withString:carName options:NSCaseInsensitiveSearch range:NSMakeRange(0, [eMailRaw length])];
    [carNamePlaceholder release];
    [carName release];

    NSString *carReviewPlaceholder = [[NSString alloc] initWithString:@"CarReview"];
    NSString *carReview = [[NSString alloc] initWithString:car.review];
    [eMailRaw replaceOccurrencesOfString:carReviewPlaceholder withString:carReview options:NSCaseInsensitiveSearch range:NSMakeRange(0, [eMailRaw length])];
    [carReviewPlaceholder release];
    [carReview release];

    //there are 5 more of these find/replace actions. the "CarReview" though is the biggest. It might contain several hundred of characters.

    //compose the message
    NSString *eMailSubject = @"Nice little car!";
    NSString *encodedSubject = [[NSString alloc] initWithString:[eMailSubject stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]]; 
    NSString *eMailBody = eMailRaw;
    NSLog(eMailBody);
    NSString *encodedBody = [[NSString alloc] initWithString:[eMailBody stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];


    NSString *urlString = [[NSString alloc] initWithString:[NSString stringWithFormat:@"mailto:?subject=%@&body=%@", encodedSubject, encodedBody]];
    NSURL *url = [[NSURL alloc] initWithString:urlString];

    [urlString release];
    [encodedBody release];
    [encodedSubject release];
    [eMailRaw release];

    [[UIApplication sharedApplication] openURL:url];

    [url release];
    }
嗯。。乍一看:

您正在释放eMailRow,即使它已设置为自动释放

这可能是问题所在吗?

嗯。。乍一看:

您正在释放eMailRow,即使它已设置为自动释放


这可能是问题所在吗?

事实上,我对[eMailRaw版本]发表了评论;从那以后,通过一些随机测试,问题就没有发生!非常感谢你。不过,我对init/release的事情还是有点不确定。我真的要疯狂地清理这些东西吗?有点过头了。我读了一些关于延迟加载的内容。这是我可以/应该在这里使用的东西吗?这样做的好处是什么?在我的代码中,延迟加载将如何转换?我想这是另一个问题,但是任何帮助都是非常感谢的。内存管理规则非常简单,而且非常重要,要知道这些规则,否则你会经常把头发扯下来。很简单,任何你分配、复制或保留的东西都需要相应的释放或自动释放。对象上的释放过多(或过少)会给您提供EXC\u BAD\u访问权限。延迟加载不会改变这些基本规则。如果你初始化了一些东西,作为一个规则,你必须释放它。您通常可以对临时变量使用方便的构造函数,这样您就不必负责管理内存。不过,了解Cocoa内存管理非常重要。苹果的指南是必读的:<>。这肯定是一个学习曲线,但一旦你克服了困难,这就出人意料地容易了。这就是我所希望的。到目前为止,我设法避免了内存管理的东西。你能说,除了多余的“释放”,这段代码在内存管理方面是令人满意的吗?在这种情况下,我将不得不检查我的所有代码,因为到目前为止,我还没有那么精确地使用它。很有可能,看看我代码的其余部分,[eMailRaw版本]是唯一的罪魁祸首。大多数时候,我只会做一些类似的事情:NSString*carnamepholder=@“CarTitle”,而不进行任何发布,这样就不会出错。那是草率的编码吗?不,那不是草率的编码。您没有分配、复制或保留它,因此不需要发布。在这种情况下,字符串将在当前运行循环结束时释放,您无需担心。关于查找代码中的泄漏(或者如果您担心的话),只需通过泄漏应用程序运行应用程序。你可能需要在谷歌上搜索一下它到底是如何工作的,但是这个分析器会告诉你你的应用程序中是否有内存丢失;从那以后,通过一些随机测试,问题就没有发生!非常感谢你。不过,我对init/release的事情还是有点不确定。我真的要疯狂地清理这些东西吗?有点过头了。我读了一些关于延迟加载的内容。这是我可以/应该在这里使用的东西吗?这样做的好处是什么?在我的代码中,延迟加载将如何转换?我想这是另一个问题,但是任何帮助都是非常感谢的。内存管理规则非常简单,而且非常重要,要知道这些规则,否则你会经常把头发扯下来。很简单,任何你分配、复制或保留的东西都需要相应的释放或自动释放。对象上的释放过多(或过少)会给您提供EXC\u BAD\u访问权限。延迟加载不会改变这些基本规则。如果你初始化了一些东西,作为一个规则,你必须释放它。您通常可以对临时变量使用方便的构造函数,这样您就不必负责管理内存。不过,了解Cocoa内存管理非常重要。苹果的指南是必读的:<>。这肯定是一个学习曲线,但一旦你克服了困难,这就出人意料地容易了。这就是我所希望的。到目前为止,我设法避免了内存管理的东西。你能说,除了多余的“释放”,这段代码在内存管理方面是令人满意的吗?在这种情况下,我将不得不检查我的所有代码,因为到目前为止,我还没有那么精确地使用它。很有可能,看看我代码的其余部分,[eMailRaw版本]是唯一的罪魁祸首。大多数时候,我只会做一些类似的事情:NSString*carnamepholder=@“CarTitle”,而不进行任何发布,这样就不会出错。那是草率的编码吗?不,那不是草率的编码。您没有分配、复制或保留它,因此不需要发布。在这种情况下,字符串将在当前运行循环结束时释放,您无需担心。关于查找代码中的泄漏(或者如果您担心的话),只需通过泄漏应用程序运行应用程序。你可能需要在谷歌上搜索一下它到底是如何工作的,但这个分析器会告诉你