0

私の知る限り、NSStringは「一度作成され、読み取り専用」タイプです。値を NSString に再割り当てする場合、実際にはポインタの値を変更して別のメモリ アドレスを指すようにしますが、NSString オブジェクトは変更されません。

私の質問は次のとおりです: NSString オブジェクトにそれを指す他のポインターがない場合、再割り当て後にメモリリークが発生していますか?

詳細については、次のコードを参照してください。

@interface ViewController ()
@property (nonatomic,strong) NSString* aString;
@end

@implementation ViewController

- (void)viewDidLoad
{
    [super viewDidLoad];
    self.aString = [NSString stringWithFormat:@"Hello %@",@"Philip"];

    // only for setting a break point
    int x;

    // reassigning 
    self.aString = [NSString stringWithFormat:@"Goodbye"];

    // only for setting another break point
    int y;
}

@end

デバッグ コンソールで:

(lldb) po self.aString
(NSString *) $0 = 0x00337d00 Hello Philip
(lldb) po self.aString
(NSString *) $1 = 0x3f41dfe0 Goodbye
(lldb) 

値を再割り当てした後、aString が別のメモリ位置を指していることを明確に示しています。0x00337d00もう 1 つの質問は、で始まるオブジェクトをデバッグ コンソールに表示するにはどうすればよいですか?

4

2 に答える 2

0

そのため、strong は ARC の保持属性の代わりになります。

@property (nonatomic,assign) NSString* aString;
于 2012-09-14T03:37:29.117 に答える
0

NSString にポインタがない場合は、解放する必要があります。これは、自動解放されたプールを返すメソッドで作成されているため、自動解放プールが考え抜かれた後にのみ発生する可能性があります。

また、リテラル NSString@"string"は、実際には定数であるため (シングルトンのように)、決して解放されません。

于 2012-09-14T03:59:38.487 に答える