首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >NSMutableString返回(null)

NSMutableString返回(null)
EN

Stack Overflow用户
提问于 2011-04-07 07:37:31
回答 2查看 687关注 0票数 0

这有什么问题吗?NSMutableString返回(null)

.h:

代码语言:javascript
复制
NSMutableString *aMutableString;
...
@property (assign) NSMutableString *aMutableString;

.m:

代码语言:javascript
复制
@synthesize aMutableString;

- (void)aMethod {
    [self setAMutableString:[[NSMutableString alloc] initWithString:@"message: "]];
    if (someCondition) {
        [[self aMutableString] appendString:@"woohoo"];
    }
}

- (void)anotherMethod {
    NSLog(@"%@", [self aMutableString]);
    [[self aMutableString] release];
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-04-07 08:03:30

首先,你的代码有几个问题。首先,您应该将aMutableString @property定义为retain,而不是assignassign通常用于基元、非对象类型,如int等,以及对象的一些特殊情况。您似乎希望以这样一种方式获得aMutableString的所有权,即它在事件循环返回后仍然存在。在您发布的代码中,您最终实现了这一点,因为您在以下行中错误地设置了aMutableString

代码语言:javascript
复制
[self setAMutableString:[[NSMutableString alloc] initWithString:@"message: "]];

通过使用alloc/init创建NSMutableString,您正在创建一个潜在的内存泄漏情况,尽管在您的情况下,它实际上弥补了您将属性定义为assign而不是retain的不足。

你的第二个-anotherMethod也是潜在的危险,因为: 1)它释放一个你定义为assign的实例变量2)释放后,它没有将它设置为nil。如果您稍后尝试访问该类中其他位置的实例变量,则很可能会发生崩溃,因为如果实例变量已被释放,指针将不再有效。

因此,代码很可能如下所示:

.h

代码语言:javascript
复制
NSMutableString *aMutableString;
...
@property (retain) NSMutableString *aMutableString;

.m:

代码语言:javascript
复制
@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

代码语言:javascript
复制
- (id)init {
  if ((self = [super init])) {
      aMutableString = [[NSMutableString alloc] init];
  }
  return self;
}
票数 0
EN

Stack Overflow用户

发布于 2011-04-07 07:41:43

确保您的.m文件中包含@synthesize aMutableString;

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5574236

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档