سؤال

انا لدي NSDate الكائن الذي تم إنشاؤه بواسطة

NSDate *date = [[NSDate alloc] init];

في وقت لاحق، أريد إعادة تعيين التاريخ إلى "الآن"، لذلك اعتقدت ذلك

[date init];

أو

date = [date init];

قد تفعل الوظيفة، لكنهم لا يفعلون ذلك. في حين أن،

[date release];
date = [[NSDate alloc] init];

يعمل. أنا مرتبك بعض الشيء حول هذا الأمر، لأنه في الوثائق ل - (id) init, ، انها تقول:

إرجاع كائن NSDate تهيئة التاريخ والوقت الحالي.

ومنذ ذلك date تم تخصيصها بالفعل، ألا يجب أن تحتاج فقط init رسالة؟

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

المحلول

افكر في alloc و init كما نصفي ينفصلان منطقيا من منشئ. يمكنك فقط استدعاء الأساليب التي تبدأ ب "INITE" مرة واحدة على كائن معين - بمجرد تهيئة الكائن، وهو خطأ في تهيئة الأمر مرة أخرى. هذا صحيح لأي كائن موضوعي، وليس فقط nsdate. ومع ذلك، كائنات NSDate هي أيضا ثابت - ذات مرة تم إنشاؤها، لا يمكنهم تغييرها.

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

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

نصائح أخرى

إذا كنت ترغب في الحصول على التاريخ الحالي، يمكنك فقط استخدام:

NSDate * now = [NSDate date];

إذا كنت ترغب في الاحتفاظ بها بعد ذلك retain هو - هي.

NSDate * now = [[NSDate date] retain];

لا يمكنك إعادة تعيين NSDate مع INIT، INIT هو فقط لتهيئة الكائن لأول مرة.

يمكنك فقط الحصول على تاريخ آخر:

NSDate * now = [[NSDate date] retain];
// use the now object
// need new date
[release now];
now = [[NSDate date] retain];
// once you don't need it release it
[now release];

ال date عودة الرسالة autoreleased حالة NSDate, ، وبالتالي release أو autorelease.

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

بالمناسبة. ال [NSDate date] هي طريقة الراحة، على الأرجح شيء مثل (وليس Sureanteed ليكون بنفس الطريقة تماما ولكن بشكل وظيفي):

- (NSDate *)date
{
    return [[[NSDate alloc] init] autorelease];
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top