2016-04-14 27 views
3

私はこの答えhttps://stackoverflow.com/a/833124/5175709と他のいくつかの質問を読んだ。私が理解していることから、オブジェクトが拡張して空間を使い果たす可能性があるので、メモリの場所も変わるからです。私たちはaddまたはappend ingで拡張し、より多くのスペースを必要とする可能性があるので、なぜNSMutableDataまたはNSMutableArray**を使用してはならないのか理解できませんでした。可変オブジェクトにダブルポインタが必要なのはなぜですか?

私が間違って理解した箇所を修正してください。私は混乱しています。

答えて

2

オブジェクト参照は、というメモリに関連しないため、単一ポインタである必要があります。例えばNSDataクラス(NSMutableDataのスーパークラス)は、おそらく以下のインスタンス変数が含まれています

(私は、ソースコードへのアクセス権を持っていないとして、これは推測です)

@interface NSData : NSObject 
{ 
    void *_data; 
    NSUInteger _length; 
} 
@end 

NSMutableDataサブクラスの場合データバッファに追加する場合は、_datarealloc()を実行し、_lengthを増やすことができます。

NSMutableDataオブジェクトへのポインタ自体は変更されず、管理するメモリは開発者から隠されています。

+0

ありがとう、実際にはポインタへのポインタを使用していますが、参照のみを扱っていますか? – Honey

+0

@ asma22哲学的に言えば、そうですが、 'Object **'という言葉の意味ではありません。例えば、 'NSMutableData'ポインタの逆参照は必ずしも' _data'メンバを指しているとは限りません。 '_length'が' _data'の前に来ればクラスも同様に動作します。 – trojanfoe

3

NSMutableArray *およびNSMutableData *は、含まれるデータへの直接のポインタではありません。

struct MutableData { 
    void * data; 
    void (*appendBytes)(void * bytes); 
    // etc. 
}; 

彼らは拡大(または縮小)のために再割り当てする必要があり、彼らが操作している内部ポインタがあります:彼らは、この線に沿ってもっと何かしています。含まれているインスタンスのユーザーとして、そのユーザーと対話しません。

関連する問題