我正在编写一个带有导航控制器和一个带有疫苗数组的基类的iOS应用程序。
@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];
返回垃圾。
我错过了什么?
您可以尝试如下方式使用Vaccine类:
// 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等这样的基本类型。它是一个物体。如果您希望在内存中维护它,则必须增加其保留计数。简单地赋值,它不允许您在内存中维护它。有关更多信息,请参见:内存管理
请记住为您的Vaccine类释放dealloc方法中的内存:
- (void)dealloc
{
self.vaxName = nil;
self.adultDescr = nil;
// release the other properties
}
根据Hyperbole的建议,在单例类中维护模型(疫苗数组)可能会更好。其他解决方案也可用(例如,在NSUserDefaults中保存/恢复模型等)。通过这种方式,您可以在应用程序的任何部分访问它。
您的setter方法在Vaccine类中是什么样子的?目前你正在给它们分配自动释放对象,所以如果你没有在setter中保留,这可能会产生你所看到的效果。
在您的访问器中,您直接将传入值分配给实例变量。这仍然是自动发布的,所以当你来访问它的时候就会消失。最简单的解决方案是使用属性并通过点符号设置值:
标题:
@proprerty (nonatomic, copy) NSString *vaccineName;
在你的实现中:
@synthesize vaccineName;
然后设置:
v.vaccineName = @"name";
你不应该使用可变字符串,如果你要分配的属性是一个字符串。