0

コードは単純です。

@interface Test : NSObject
@property (nonatomic, strong) NSString * str;  //strong
//@property (nonatomic, weak) NSString * str;  //weak
-(void)func;
@end

@implementation Test
@synthesize str = _str;
-(void)func{
   _str = @"test string";       // using ivar
   //self.str = @"test string"; // using setter
}
@end

four上記のコードには、強い/弱い、ivar/セッターの状況があります

メモリリークを引き起こすのはどのタイプですか?

どのタイプが同じですか?

NSLog を使用してコードをテストしましたが、すべて正常に実行されました (nil は出力されません)。なぜですか? たぶん約autorelease

- - - - - - - 編集 - - - - - - - -

ドキュメントを読んだところ、「文字列定数は決して解放されない」ことがわかりました

そのため、文字列が initWithString または initWithFormat で初期化されると、コードの動作が異なります (そして、私が書いたコードは間違っています)

initWithFormat を使用する場合、weak プロパティは常に nil です

メモリ管理の場合、ivar と setter は同じです: ARC の強力なプロパティには self.iVar が必要ですか?

4

2 に答える 2

0

私もいつもこれについて混乱しますが、基本的に弱いとは、クラスが nil に設定されたときに消えることを意味すると思いますが、強いとは +1 の保持カウントがあるため、var も削除されるまでクラスが消えません。で開始する。

適切に使用するとどちらもリークが発生せず、両方とも適切に使用できないため、どちらがリークを引き起こすかを実際に尋ねることはできません.

于 2012-06-10T21:32:48.797 に答える
0

ARC を使用している場合、システムはメモリを処理し、リークとして報告しません。ARC と強参照と弱参照の違いについては、こちらの記事を参照してください。

http://www.quora.com/Objective-C-programming-language/In-Objective-C-whats-the-difference-between-a-strong-and-weak-pointer

于 2012-06-10T17:56:09.880 に答える