كيفية الافراج عن NSMutableDictionary سبيل المثال متغير بشكل صحيح ، مع تضمينه القواميس في الهدف C ؟

StackOverflow https://stackoverflow.com/questions/1402778

سؤال

أنا موضوعي C-class التي تبدو شيئا مثل:

@interface myClass : NSObject
{
    NSMutableDictionary *aDict;
}

اضع طريقة تبدو مثل:

- (void) setADict: (NSMutableDictionary *) newDict
{
    [aDict release];
    [newDict retain];
    aDict = newDict;
}

لقد خلق مثيل من الكائن ، وضع البيانات في aDict و الآن يريدون التخلص من الكائن, تنظيف الذاكرة في هذه العملية.سؤالين:

1) يجب أن الإفراج aDict في myClass's dealloc الطريقة كما تظهر ؟

[aDict release];

=============================================================================

2) لقد متداخلة العديد من الأطفال في القواميس aDict, ممثلة كيا و keyB, مثل:

// aDict:
{
    keyA =     {
        keyA1 = "Hello world";
        keyA2 = 1234;
    };
    keyB =     {
        keyB1 = Earth;
        keyB2 = 25000;
    };
}

سوف [aDict إطلاق] رسالة "نشر أسفل السلسلة" و تنظيف جميع الأطفال القواميس داخل aDict ، بما في ذلك بهم مفتاح/قيمة الأشياء ؟ أو أن أفعل شيئا آخر للتخلص منهم ؟

هل كانت مفيدة؟

المحلول

نعم.

جمع الكائنات الإبقاء على الأمور أنهم جمع ، وذلك عندما جمع deallocated ، أرصدة تحتفظ مع الإصدار.

ثم إذا كان أحد القواميس كان التمسك هو deallocated ، فإنه سيتم أيضا الإفراج عن مفتاح/قيمة أزواج منذ القاموس هو جمع وجمع الكائنات الإبقاء على الأشياء انهم يجمعون.

نفس الشيء ينطبق على المصفوفات و مجموعات.

ولكن لديك خطأ في التعليمات البرمجية الخاصة بك.لديك:

- (void) setADict: (NSMutableDictionary *) newDict
{
    [aDict release];
    [newDict retain];
    aDict = newDict;
}

النظر في القضية عند newDict هو نفس موضوع aDict.ثم الإفراج عن القاموس ، فمن deallocated ثم محاولة الاحتفاظ بها ، ولكن يصيح!لم يعد هناك.

هناك ثلاثة بدائل لإصلاح هذا.ها هم:

    - (void) setADict: (NSMutableDictionary *) newDict
    {
        [aDict autorelease];
        [newDict retain];
        aDict = newDict;
    }

    - (void) setADict: (NSMutableDictionary *) newDict
    {
      if (aDict != newDict) {
        [aDict release];
        [newDict retain];
        aDict = newDict;
      }
    }

    - (void) setADict: (NSMutableDictionary *) newDict
    {
        [newDict retain];
        [aDict release];
        aDict = newDict;
    }

يمكنني القول الثالث هو أبسط ، والثاني هو أسرع مع مرور الوقت, و الأول هو meh.أول بملئ autorelease حمامات (التي قد تكون أو قد لا تؤدي إلى انفخ الذاكرة).الثانية و الثالثة تعادل من حيث السلامة والممتلكات إدارة الذاكرة.ومع ذلك ، فإن الثانية سيوفر لك لا لزوم لها طريقة المكالمات إذا كنت يحدث أن يكون وضع نفس القاموس على نفسها.

نصائح أخرى

NSMutableDictionary سيتم الإفراج عن جميع الكائنات (القيم) على الافراج عنهم.

NSMutableDictionary نسخ مفتاح إرسال الإبقاء على قيمة لكل مفتاح/قيمة الزوج الذي قمت بإضافته.الكاكاو الممارسة هو أنه عندما يكون هناك شيء يحتفظ مرجع فمن المسؤول عن إطلاقه.

انظر NSMutableDictionary المرجعية

طرق إضافة إدخالات إلى القواميس سواء كجزء من التهيئة (لجميع القواميس) أو من خلال تعديل (بالنسبة قابلة للتغيير القواميس)—نسخة كل مفتاح الحجة (مفاتيح يجب أن تتوافق مع NSCopying البروتوكول) و إضافة النسخ إلى القاموس.كل المقابلة القيمة كائن يتلقى الاحتفاظ رسالة إلى ضمان أنه لن يكون deallocated قبل أن القاموس هو من خلال مع ذلك.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top