iPhone内存管理
我正要出丑,但我注意到这里有很多友好和耐心的人,所以我就试一下: 我正在开发一个iPhone应用程序,其中包含一个汽车评论数据库。我希望用户能够通过电子邮件共享评论。因此,当他/她在应用程序中发现一辆有趣的汽车时,他/她会按下一个按钮,应用程序就会通过iPhone的Mail.app编写一封电子邮件 现在。我是个新手,我必须承认我对iPhone上的内存管理不是很熟悉。我编写的代码,这个特定的邮件方法,在退出应用程序时会显示可怕的“ProgramReceived signal:“EXC_BAD_ACCESS”消息。谷歌搜索表明这是内存管理不好的结果 在我对这件事不太了解的情况下,我开始显式初始化,然后像疯子一样释放所有临时变量。然而,“EXC_BAD_ACCESS”不断出现 这里有趣的一点是:一旦我杀死我的应用程序,构建的URL仍然会触发Mail.app,并愉快地为我创建电子邮件iPhone内存管理,iphone,memory,Iphone,Memory,我正要出丑,但我注意到这里有很多友好和耐心的人,所以我就试一下: 我正在开发一个iPhone应用程序,其中包含一个汽车评论数据库。我希望用户能够通过电子邮件共享评论。因此,当他/她在应用程序中发现一辆有趣的汽车时,他/她会按下一个按钮,应用程序就会通过iPhone的Mail.app编写一封电子邮件 现在。我是个新手,我必须承认我对iPhone上的内存管理不是很熟悉。我编写的代码,这个特定的邮件方法,在退出应用程序时会显示可怕的“ProgramReceived signal:“EXC_BAD_AC
请考虑下面的示例代码,并向我开枪。
- (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”,而不进行任何发布,这样就不会出错。那是草率的编码吗?不,那不是草率的编码。您没有分配、复制或保留它,因此不需要发布。在这种情况下,字符串将在当前运行循环结束时释放,您无需担心。关于查找代码中的泄漏(或者如果您担心的话),只需通过泄漏应用程序运行应用程序。你可能需要在谷歌上搜索一下它到底是如何工作的,但这个分析器会告诉你