NSMutableString返回(null)

时间:2011-04-06 23:37:31

标签: objective-c

这有什么问题? 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];
}

2 个答案:

答案 0 :(得分:1)

首先,您的代码存在一些问题。首先,您应将aMutableString @property定义为retain,而不是assignassign通常用于原始的非对象类型,如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;