首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >内存保留问题

内存保留问题
EN

Stack Overflow用户
提问于 2011-12-20 04:48:09
回答 2查看 122关注 0票数 0

我正在编写一个带有导航器控制器和一个带有疫苗数组的基类的iOS应用程序。

代码语言:javascript
复制
@synthesize vaccines;

self.vaccines = [[NSMutableArray alloc] initWithObjects:nil];

Vaccine *v = [[Vaccine alloc] init];
[v setVaxName: [NSMutableString stringWithString: @"Anthrax" ]];
[v setAdultDescr: [NSMutableString stringWithString: @"" ]];
[v setPed06Descr: [NSMutableString stringWithString: @"" ]];
[v setPed718Descr: [NSMutableString stringWithString: @"" ]];
[v setPedCatchDescr: [NSMutableString stringWithString: @"" ]];
[self.vaccines addObject:v];
[v release];

我在委托类中使用此方法来访问疫苗的名称:

代码语言:javascript
复制
- (NSString *) getVaccineName: (NSInteger) i
{
if ([vaccines count] > i)
{
    return [[vaccines objectAtIndex:i] getVaxName];
}
return @"";
}

我在类Vaccine中使用一个方法来访问该名称。

代码语言:javascript
复制
(NSMutableString *) getVaxName
{
    return vaxname;
}

在创建时,疫苗是巧妙的,并返回“炭黑”。但是,当我转到另一个页面时,我调用:

代码语言:javascript
复制
NSString *str = [delegate getVaccineName: 0];

这将返回垃圾。

我遗漏了什么?

EN

回答 2

Stack Overflow用户

发布于 2011-12-20 06:03:05

您可以尝试使用Vaccine类,如下所示:

代码语言:javascript
复制
// Vaccine.h
@interface Vaccine: NSObject {
    NSString *vaxName;
    NSString *adultDescr;
    // crete the other instance variables
}
@property(copy, nonatomic) NSString *vaxName;
@property(copy, nonatomic) NSString *adultDescr;
// add the other accessor properties
@end

// Vaccine.m
@implementation Vaccine

@synthesize vaxName
@synthesize adultDescr
// synthesize the other properties

@end

此时,您可以修改您提供的第一个代码片段,如下所示:

代码语言:javascript
复制
Vaccine *v = [[Vaccine alloc] init];
v.vaxName = @"name"; // its the same as [v setVaxName:@"name"];
v.adultDescr = @"descr";
// set the other properties

NSString不是像int、float等那样的基元类型。它是一个物体。如果你想在内存中维护它,你必须增加它的保留计数。简单地分配它,它不允许你把它保存在内存中。有关更多信息,请参阅:memory management

记住在你的Vaccine类的dealloc方法中释放内存:

代码语言:javascript
复制
- (void)dealloc
{
   self.vaxName = nil;
   self.adultDescr = nil;
   // release the other properties
}

根据夸张的建议,例如,在单例类中维护您的模型(疫苗阵列)可能会更好。还可以使用其他解决方案(例如,在NSUserDefaults中保存/恢复模型等)。通过这种方式,您可以在应用程序的任何部分访问它。

票数 1
EN

Stack Overflow用户

发布于 2011-12-20 05:06:38

您的setter方法在Vaccine类中是什么样子的?此时,您正在将自动释放的对象分配给它们,因此如果您没有保留在setter中,这可能会产生您所看到的效果。

在访问器中,您直接将传入的值赋给一个实例变量。它仍然是自动释放的,所以当你访问它的时候,它将会消失。最简单的解决方案是使用属性并通过点符号设置值:

在您的标题中:

代码语言:javascript
复制
@proprerty (nonatomic, copy) NSString *vaccineName;

在您的实现中:

代码语言:javascript
复制
@synthesize vaccineName;

然后设置:

代码语言:javascript
复制
v.vaccineName = @"name";

如果要分配的属性是字符串,则不应使用可变字符串。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8567357

复制
相关文章

相似问题

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