سؤال

في الهدف، ج، إذا تم نسخ Array1 على Array2 باستخدام Mutablecopy، ونفترض أن الرمز يتم في Main ()، من المسؤول عن إطلاق الكائنات الموجودة في الصفيف؟ هل هو الرئيسي () أو Array2؟

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

المحلول

أعتقد أن الإجابات السابقة قد فاتتها هذه النقطة، وإلا كان أساءه غير واضح جدا. السؤال الفعلي لا يتحدث عن مجموعة إما، بل محتويات الصفيف:

من المسؤول عن إطلاق الكائنات الواردة في الصفيفب هل هو الرئيسي () أو Array2؟

كلاهما array1 و array2 هي المسؤولة عن إطلاق الكائنات.

من وثائق nsarray:

"تحافظ الصفائف على مراجع قوية إلى محتوياتها - في بيئة الذاكرة المدارة، يتلقى كل كائن رسالة الاحتفاظ قبل إضافة معرفها إلى الصفيف ورسالة إصدار عند إزالته من الصفيف أو عند إلغاء تخصيص الصفيف."

لتبدأ، يتم الاحتفاظ بكل من الكائنات بواسطة NSArray array1. وبعد عند إنشاء array2 عبر -mutableCopy, ، يمكنك الحصول على nsmutablerray التي تشير إلى نفس الكائنات، وتحتفظ بكل منها مرة أخرى. إذا كنت في الإفراج array1 في هذه المرحلة، عندما dealloc تم استدعاؤها بطريقة تحرير كل من الكائنات التي يحتوي عليها. ومع ذلك، array2 احتفظت بهم، وبالتالي لن يتم تدمير الكائنات - فقط عندما يصل عدد الاحتفاظ بهم 0، والذي سيحدث إذا array2 تم تدمير ولا أحد آخر قد احتفظ بأي من الكائنات (أو عند إزالتها من array2).

نظرا لأن فئات التحصيل (صفائف، مجموعات، قواميس، وما إلى ذلك) تعامل مع الاحتفاظ وتطلق محتوياتها، كل ما عليك أن تقلق بشأنه هو الاحتفاظ أو إطلاق سراح المجموعة نفسها. منذ أن استخدمت -mutableCopy, تذكر أنك قد احتفظت بالضيوف array2, ، لذلك يجب أن تحريرها عند الانتهاء من ذلك.

نصائح أخرى

أنا مرجع هذا الدليل لإدارة الذاكرة في obj-c. لديه قسم على المصفوفات والقواميس، وهنا مقتطف:

المصفوفات، القواميس وما إلى ذلك تحتفظ بشكل عام بأي كائنات تضاف إليها. (عند التعامل مع كائنات نوع جمع الطرف الثالث، تحقق دائما من الوثائق لمعرفة ما إذا كانت تحتفظ بها أم لا). هذا يعني أن هذه المجموعات ستتناول الملكية للكائن، ولا تحتاج إلى الاحتفاظ قبل إضافة.

تعليقات النشر هي أيضا مفيدة

لا تتغير مسؤوليات الملكية عن طريق تخزين الكائنات في صفيف. إليك مثال:

int main(int argc, char *argv[])
{
    // ...

    NSObject *obj1 = [[NSObject alloc] init]; // owned
    NSObject *obj2 = [[NSObject alloc] init]; // owned
    NSObject *obj3 = [[[NSObject alloc] init] autorelease]; // not owned

    NSMutableArray *array1 = [NSMutableArray arrayWithObjects: obj1, obj2, obj3, nil]; // not owned
    NSMutableArray *array2 = [array1 mutableCopy]; // owned

    // ...

    [array2 release];
    [obj2 release];
    [obj1 release];

    // ...
}

تخصص هذا الرمز مباشرة obj1 و obj2, ، لذلك تمتلكها ويجب أن تطلقها، ولكن تكنولوجيا المعلومات obj3, ، لذلك لا يتعين عليه إطلاق سراح ذلك. بنفس الطريقة، لا تملك نتيجة arrayWithObjects:, ، لذلك لا يفرج عن ذلك، لكنه يمتلك نتيجة mutableCopy, ، لذلك يجب أن تصدر ذلك. الكائنات التي يتم تخزينها في مجموعة غير صحيحة - كل ما تحتاجه لرعاية هو الملكية.

كلا الصفائف تبقي مراجع قوية لمحتواه، لذلك obj1, obj2, ، و obj3 لن يتم تخصيصها طالما أن الصفائف موجودة - ولكن هذه تفاصيل NSArray العقد، لا يؤثر على كيفية إدارة ملكية الكائنات أو الصفائف.

هذه كلها تفاصيل اتفاقيات إدارة ذاكرة الكاكاو, ، لا صفائف.

لن يكون من المنطقي على صفيف قابل للتغيير لربطها بمجموعة ثابتة. الرئيسية () سيكون مسؤولا عن إطلاق سراح Array1.

في تجربتي ومع ذلك، يؤدي إطلاق الكائنات فقط إلى تعطل الطلبات فقط. OBJC جيدة إلى حد ما في إدارة الذاكرة تلقائيا. لا يبدو أن تطبيقات Cocoa الخاصة بي تحتاج إلى مزيد من الذاكرة مما بدأت معها، حتى بعد تشغيل عدة ساعات.

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