我正在编写一个带有导航器控制器和一个带有疫苗数组的基类的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];这将返回垃圾。
我遗漏了什么?
发布于 2011-12-20 06:03:05
您可以尝试使用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 propertiesNSString不是像int、float等那样的基元类型。它是一个物体。如果你想在内存中维护它,你必须增加它的保留计数。简单地分配它,它不允许你把它保存在内存中。有关更多信息,请参阅:memory management
记住在你的Vaccine类的dealloc方法中释放内存:
- (void)dealloc
{
self.vaxName = nil;
self.adultDescr = nil;
// release the other properties
}根据夸张的建议,例如,在单例类中维护您的模型(疫苗阵列)可能会更好。还可以使用其他解决方案(例如,在NSUserDefaults中保存/恢复模型等)。通过这种方式,您可以在应用程序的任何部分访问它。
发布于 2011-12-20 05:06:38
您的setter方法在Vaccine类中是什么样子的?此时,您正在将自动释放的对象分配给它们,因此如果您没有保留在setter中,这可能会产生您所看到的效果。
在访问器中,您直接将传入的值赋给一个实例变量。它仍然是自动释放的,所以当你访问它的时候,它将会消失。最简单的解决方案是使用属性并通过点符号设置值:
在您的标题中:
@proprerty (nonatomic, copy) NSString *vaccineName;在您的实现中:
@synthesize vaccineName;然后设置:
v.vaccineName = @"name";如果要分配的属性是字符串,则不应使用可变字符串。
https://stackoverflow.com/questions/8567357
复制相似问题