这有什么问题吗?NSMutableString返回(null)。
.h:
NSMutableString *aMutableString;
...
@property (assign) NSMutableString *aMutableString;.m:
@synthesize aMutableString;
- (void)aMethod {
[self setAMutableString:[[NSMutableString alloc] initWithString:@"message: "]];
if (someCondition) {
[[self aMutableString] appendString:@"woohoo"];
}
}
- (void)anotherMethod {
NSLog(@"%@", [self aMutableString]);
[[self aMutableString] release];
}发布于 2011-04-07 08:03:30
首先,你的代码有几个问题。首先,您应该将aMutableString @property定义为retain,而不是assign。assign通常用于基元、非对象类型,如int等,以及对象的一些特殊情况。您似乎希望以这样一种方式获得aMutableString的所有权,即它在事件循环返回后仍然存在。在您发布的代码中,您最终实现了这一点,因为您在以下行中错误地设置了aMutableString:
[self setAMutableString:[[NSMutableString alloc] initWithString:@"message: "]];通过使用alloc/init创建NSMutableString,您正在创建一个潜在的内存泄漏情况,尽管在您的情况下,它实际上弥补了您将属性定义为assign而不是retain的不足。
你的第二个-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。您是否在调用-anotherMethod之前先调用-aMethod
如果要确保将aMutableString初始化为空字符串,则可以覆盖-init
- (id)init {
if ((self = [super init])) {
aMutableString = [[NSMutableString alloc] init];
}
return self;
}发布于 2011-04-07 07:41:43
确保您的.m文件中包含@synthesize aMutableString;
https://stackoverflow.com/questions/5574236
复制相似问题