这有什么问题? NSMutableString返回(null)
。
NSMutableString *aMutableString;
...
@property (assign) NSMutableString *aMutableString;
@synthesize aMutableString;
- (void)aMethod {
[self setAMutableString:[[NSMutableString alloc] initWithString:@"message: "]];
if (someCondition) {
[[self aMutableString] appendString:@"woohoo"];
}
}
- (void)anotherMethod {
NSLog(@"%@", [self aMutableString]);
[[self aMutableString] release];
}
答案 0 :(得分:1)
首先,您的代码存在一些问题。首先,您应将aMutableString
@property
定义为retain
,而不是assign
。 assign
通常用于原始的非对象类型,如int
等,以及一些特殊的对象。您似乎希望获得aMutableString
的所有权,使其在事件循环返回后仍然存在。在您发布的代码中,由于您在以下行中错误地设置了aMutableString
,您最终会完成此操作:
[self setAMutableString:[[NSMutableString alloc] initWithString:@"message: "]];
通过使用alloc / init创建NSMutableString,您可能会创建潜在的内存泄漏情况,但在您的情况下,它实际上弥补了您将属性定义为assign
而不是保留。
你的第二个-anotherMethod
也有潜在危险:
1)它释放你定义为assign
的实例变量
2)释放后,它不会将其设置为nil
。如果您稍后尝试在该类的其他位置访问该实例变量,则可能会因为指针不再有效而崩溃,如果实例变量已被解除分配。
因此,代码应该看起来像这样:
·H
NSMutableString *aMutableString;
...
@property (retain) NSMutableString *aMutableString;
的.m:
@synthesize aMutableString;
- (void)dealloc {
[aMutableString release];
[super dealloc];
}
- (void)aMethod {
[self setAMutableString:[NSMutableString stringWithString:@"message: "]];
if (someCondition) {
[aMutableString appendString:@"woohoo"];
}
}
- (void)anotherMethod {
NSLog(@"%@", aMutableString);
// the following is potentially unsafe!
// [[self aMutableString] release];
// it should be one of the following:
[aMutableString release]; aMutableString = nil;
// or
// [self setAMutableString:nil];
}
尽管如此,如果没有更多信息,就很难说出问题所在。我认为您的意思是NSLog()
来电正在打印(null)
?如果是,则表示aMutableString
仍为nil
。您是否在致电-aMethod
之前致电-anotherMethod
?
如果您想确保将aMutableString
初始化为空字符串,则可以覆盖-init
:
- (id)init {
if ((self = [super init])) {
aMutableString = [[NSMutableString alloc] init];
}
return self;
}
答案 1 :(得分:0)
确保您的.m文件中有@synthesize aMutableString;