2012-02-13 2 views
-1

Так что я полагаю, что это проблема памяти, вот код:Как вернуть NSString * в Objective C (продолжать получать неверное резюме)

- (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 имеет недопустимое резюме при отладке и сбой при запуске. Я подозреваю, что мне не хватает удержания или чего-то еще, может кто-то может помочь? Благодарю.

+5

Если у вас есть статическая строка, вам не нужно, чтобы сохранить его , поэтому есть что-то, что вы не показываете, что вызывает проблему. – ThomasW

+0

Вам нужно показать больше кода. Либо вы возвращаете выпущенный объект, либо ваш коммутатор не является исчерпывающим, и вы фактически проходите мимо него, не присваивая ему 's' (что означает, что это значение мусора). –

+0

aString на самом деле является переменной-членом для всего класса это, если это имеет значение. Этот вызов является первым, когда ему присваивается значение. Попробую другие предложения сейчас. –

ответ

3

То, что вы получили прекрасно работает:

#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


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

Смежные вопросы