Как вернуть NSString * в Objective C (продолжайте получать неверное резюме) - PullRequest
0 голосов
/ 13 февраля 2012

Итак, я предполагаю, что это проблема с памятью, вот код:

- (NSString *)giveMeAStringGoddammit
{  
  NSString *s;
  // switch statement to choose which string to assign to s, so essentially:
  s = @"a string";      
  return s;  
}

И код вызова:

NSString *aString;
aString = [self giveMeAStringGoddammit];

Однако после этого вызова aString выдает неверную сводку, когдаотлаживается и вылетает при запуске.Я подозреваю, что мне не хватает удержания или что-то, кто-то может помочь?Спасибо.

Ответы [ 2 ]

3 голосов
/ 13 февраля 2012

То, что у тебя есть, прекрасно работает:

#import <Foundation/Foundation.h>

@interface Test : NSObject
- (NSString *)giveMeAStringGoddammit;
@end

@implementation Test
- (NSString *)giveMeAStringGoddammit
{  
    NSString *s;
    // switch statement to choose which string to assign to s, so essentially:
    s = @"a string";      
    return s;  
}
@end

int main (int argc, const char * argv[])
{
    @autoreleasepool {
        Test *t = [[Test alloc] init];
        NSLog(@"t says: %@", [t giveMeAStringGoddammit]);
    }
    return 0;
}

Вывод этой программы:

t says: a string

Чтобы сделать это немного более реалистичным, давайте изменим его на использование свойства:

#import <Foundation/Foundation.h>

@interface Test : NSObject
@property(copy, nonatomic) NSString *string;
- (NSString *)giveMeAStringGoddammit;
@end

@implementation Test
@synthesize string;
- (NSString *)giveMeAStringGoddammit
{  
    NSString *s;
    // switch statement to choose which string to assign to s, so essentially:
    s = self.string;
    return s;  
}
@end

int main (int argc, const char * argv[])
{
    @autoreleasepool {
        Test *t = [[Test alloc] init];
        t.string = @"Hello world!";
        NSLog(@"t says: %@", [t giveMeAStringGoddammit]);
    }
    return 0;
}

Это делает то, что вы ожидаете:

t says: Hello world!
0 голосов
/ 13 февраля 2012

Вы создали объект указателя, и ожидается, что он будет увеличивать количество сохраняемых файлов при каждом обращении к ним. Для увеличения счетчика хранения следует инициировать строку и выделить ее память, иначе вы можете использовать [NSString stringwithString: [self giveMeAStringGoddammit] ,Вы можете использовать это определение только в том случае, если оно вам точно нужно, чтобы ссылаться на него локально.потому что всякий раз, когда вы пытаетесь отослать его наружу, пул авто-релизов может вызвать сбой приложения (следовательно, он не сохраняется вручную).Поэтому, если вам нужно использовать его вне функции, лучше используйте [NSString alloc] init] , а затем загрузите вашу строку в объект указателя. Хорошо, чтобы заставить ваш код работать, добавьте строкиNSString *aString = [NSString stringWithString:[self giveMeAStringGoddammit]]; NSLog(@"My Str:%@",aString);Ура теперь, черт побери, строка была дана ......

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