سؤال

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

var اليوم هو الفئة الفتحية التي بدأت كما .. اليوم = [تاريخ nsdate

هنا هي الطريقة التي تعطل:

 (IBAction)changeDateByOne:(id)sender{

NSDate *newDay;
NSDate *currentDay = today;

NSTimeInterval secondsPerDay = 24 * 60 * 60;

if(sender == leftButton){
     newDay = [currentDay addTimeInterval:-secondsPerDay];

}else if(sender == rightButton) { 
     newDay = [currentDay addTimeInterval: secondsPerDay];


}

today = newDay;

}

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

المحلول

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

عند تهيئة المثيل، استخدم:

today = [[NSDate date] retain];

أود تغيير السطر الأخير إلى:

[today release];
today = [newDay retain];

وأخيرا، في طريقة Deallec الخاصة بك، أضف:

[today release];

قبل الاتصال [سوبر deallec]؛

نصائح أخرى

تحتاج إلى قراءة وثائق إدارة الذاكرة. هذا هنا

http://developer.apple.com/iphone/library/documentation/cocoa/conectual/memorymgmt/memorymgmt.html.

إذا كنت تضيف أو طرح أيام، فقد ترغب في قراءة هذا وسيلة بديلة للقيام بنفس الشيء:

http://developer.apple.com/iphone/library/documentation/cocoa/conectual/datesandttimes/datesiticles/dtcalendrialcalcalces.html#//apple_ref/doc/uid/tp40007836-sw1.

أخيرا، إذا تعطل شيء ما، فمن المفيد غالبا النظر في الآثار الخلفية (وتضمينها في أسئلتك إذا لم تتمكن من معرفة ذلك بنفسك). تحدث الأخطاء إدارة الذاكرة عادة ما تكون المشكلة إذا رأيت objc_msgsend (أو أحد أصحابها) في التتبع.

ربما تحتاج إلى القول

today = [[NSDate date] retain]

أعتقد أنك بحاجة إلى الاحتفاظ بالكائن اليومي الذي تم إرجاعه من طريقة AddTimeInval. قد تحتاج أيضا إلى الإفراج اليوم قبل أن تقوم بالتعيين في النهاية.

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