سؤال

أعتقد أن لدي مشكلة في إدارة الذاكرة. يتحول nsarray الخاص بي (يسمى ARR) إلى أشياء مختلفة في أوقات عشوائية. ليس لدي أي فكرة عن السبب. لدي ملف .h الذي يعلن الصفيف ، ثم أقوم بتهيئة المصفوفة باستخدام

NSString *input = [[NSString alloc] initWithData:myData encoding:NSACIIStringEncoding];
arr = [input componentsSeperatedByString:@"\n"];

ثم أستخدمه في جميع أنحاء البرنامج وفجأة يتحول إلى أشياء مختلفة (uitouch ، في بعض الأحيان ، على سبيل المثال). لم أتصل أبدًا بالإصدار. لماذا تفعل هذا؟ كيف يمكنني منع تغيير الكائنات بشكل عشوائي بسبب مشكلات الذاكرة؟

شكرًا!

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

المحلول

حاول الاحتفاظ arr.

arr = [[input componentsSeperatedByString:@"\n"] retain];

نصائح أخرى

ما يحدث ، هو أن الذاكرة ، التي تشغلها NSArray الخاصة بك ، تشغلها كائن آخر. قد يكون هذا أي كائن ، وبما أنك تلمس الشاشة كثيرًا ، فإن uitouch شائع جدًا.

هذا يعني أنك لا تحتفظ بـ nsarray عندما يجب عليك ذلك ، لذلك يتم إصدارها قبل الأوان. لا تعرض الكود الذي يعلن arr, ، ولكن إذا أعلنت ARR

@property (nonatomic,retain) NSArray *arr;

وتوليفه باستخدام

@synthesize arr;

ثم يتم التعامل مع الاحتفاظ ببساطة self.arr بدلاً من arr:

self.arr = [input componentsSeperatedByString:@"\n"];

في الكاكاو ، الكائن الخاص بك الآن "يمتلك" المصفوفة. في ال dealloc طريقة هذا الفصل ، يجب عليك [self.arr release].

هل يجب عليك تعيين مجموعة أخرى إلى self.arr, ، الكائن المخصص ل self.arr في السابق سوف يتم إطلاق سراحه ، والاحتفاظ بالذات الجديدة.

أو initalize مجموعة جديدة مع هذه المصفوفة:

arr = [[NSArray alloc] initWithArray:input];
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top