NSMutableString возвращение (ноль) - PullRequest
0 голосов
/ 07 апреля 2011

Что с этим не так? 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 ]

1 голос
/ 07 апреля 2011

Прежде всего, у вашего кода есть пара проблем.Во-первых, вы должны определить aMutableString @property как retain, а не assign.assign обычно предназначен для примитивных необъектных типов, таких как int s и т. Д., А также для некоторых особых случаев объектов.Похоже, вы хотите стать владельцем aMutableString таким образом, чтобы оно сохранялось после возврата цикла событий.В своем опубликованном коде вы заканчиваете тем, что из-за неправильной установки aMutableString в следующей строке:

[self setAMutableString:[[NSMutableString alloc] initWithString:@"message: "]];

Создавая NSMutableString с помощью alloc / init, вы создаете потенциальную памятьСитуация утечки, хотя в вашей ситуации она фактически компенсирует ваше определение свойства как 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;
}
0 голосов
/ 07 апреля 2011

Убедитесь, что у вас есть @synthesize aMutableString; в вашем .m файле

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...