内存保留问题

时间:2011-12-19 20:48:09

标签: ios

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

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

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

- (NSString *) getVaccineName: (NSInteger) i
{
if ([vaccines count] > i)
{
    return [[vaccines objectAtIndex:i] getVaxName];
}
return @"";
}

我使用Vaccine类中的方法来访问该名称。

(NSMutableString *) getVaxName
{
    return vaxname;
}

创建疫苗后,疫苗就会出现并返回“炭疽病毒”。但是,当我转到另一页时,我打电话给:

NSString *str = [delegate getVaccineName: 0];

这会返回垃圾。

我错过了什么?

2 个答案:

答案 0 :(得分:1)

您可以尝试使用疫苗类如下:

// 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

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

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

请记住以疫苗类的dealloc方法释放内存:

- (void)dealloc
{
   self.vaxName = nil;
   self.adultDescr = nil;
   // release the other properties
}

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

答案 1 :(得分:0)

疫苗类中你的setter方法是什么样的?您正在为它们分配自动释放的对象,所以如果您没有保留在设置器中,这可能会产生您所看到的效果。

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

在标题中:

@proprerty (nonatomic, copy) NSString *vaccineName;

在您的实施中:

@synthesize vaccineName;

然后设置:

v.vaccineName = @"name";

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