2012-02-13 8 views
-1

だから私は、これはメモリの問題であると推定は、ここにコードは次のとおりです。(無効な要約を得続ける)

- (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はデバッグ時に無効な要約を持ち、実行時にクラッシュします。 私は、誰かを助けることができます保持または何かが不足していると思う?ありがとう。

#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 

のは、プロパティを使用するように変更してみましょう、これはもう少し現実的にするために:あなたはちょうど良い作品を持って何

+5

は、あなたはそれを保持する必要はありません。 、あなたが問題を引き起こしていることを示していないことがあります。 – ThomasW

+0

もっとコードを表示する必要があります。あなたが解放されたオブジェクトを返すか、スイッチが包括的ではなく、実際に 's'に代入することなくそれを過ぎている(これはガーベジの値を意味する) –

+0

aStringは実際にはクラスallそれが差異を生むならば、これがあります。この呼び出しは、最初に値が割り当てられます。今、他の提案をしようとしています。 –

答えて

3

#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);
今goddammit文字列が与えられた万歳を追加することです......あなたは静的な文字列を持っている場合

関連する問題