سؤال

لدي فئة نموذج قاعدة البيانات أي NSObject. وبعد لدي مجموعة من هذه الكائنات في NSMutableArray. وبعد أنا أستعمل indexOfObject: للعثور على المباراة. المشكلة هي تغييرات عنوان ذاكرة الكائن النموذجي. لذلك أنا تجاوز hash طريقة لإرجاع معرف صف النموذج. هذا ولكن لا يصلحه. يجب أن أتجاوز isEqual: طريقة لمقارنة قيمة hash طريقة.

ماذا يكون ال isEqual: استخدام الأسلوب لتحديد المساواة افتراضيا؟

أنا أفترض أنه يستخدم عنوان الذاكرة. بعد قراءة isEqual: وثائق اعتقدت أنها استخدمت القيمة من hash طريقة. من الواضح أن هذا ليس هو الحال لأن محاولتي لتجاوز هذه القيمة لم تحل مشكلتي الأولية.

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

المحلول

كما كنت خمنت بشكل صحيح، NSObjectالافتراضي isEqual: السلوك يقارن عنوان ذاكرة الكائن. الغريب، هذا ليس موثقا حاليا في إشارة فئة NSOBJECT, ، ولكن تم توثيقها في استبطان - سبر غور الوثائق، التي تنص:

الافتراضي NSObject بداية شئ isEqual: ما عليك سوى التحقق من المساواة مؤشر.

بالطبع، كما تعلمون بلا شك، فئات فرعية من NSObject يمكن تجاوز isEqual: أن تتصرف بشكل مختلف. علي سبيل المثال، NSStringisEqual: الطريقة، عندما مرت آخر NSString, ، سوف تحقق أولا من العنوان ثم تحقق من وجود مباراة حرفية دقيقة بين السلاسل.

نصائح أخرى

الجواب حول التنفيذ الافتراضي لل isEqual: واحد شامل. لذلك أنا فقط أضف ملاحظتي حول التنفيذ الافتراضي لل hash. وبعد ها هو:

-(unsigned)hash {return (unsigned)self;}

أي أنها مجرد نفس قيمة المؤشر التي تستخدم في isEqual:. وبعد إليك كيف يمكنك التحقق من ذلك:

NSObject *obj = [[NSObject alloc] init];
NSLog(@"obj: %@",obj);
NSLog(@"hash: %x",obj.hash);

ستكون النتيجة شيئا مثل هذا:

obj: <NSObject: 0x16d44010>
hash: 16d44010

مع أطيب التحيات.

راجع للشغل في iOS 8 hash أصبحت خاصية ليست طريقة، ولكن هناك.

أود أن أفترض ذلك NSObject isEquals يستخدم == المشغل، و hash يستخدم عنوان الذاكرة.

isEquals يجب أن تستخدم الطريقة hash كاختبار مطلق للمساواة. من المضمون أن يكون لديك كائنين مماثلة hashCode, ، إذا كنت تبحث عن كائنات كافية (فقط إنشاء أكثر من 2 ^ 32 كائنات مختلفة، وسوف يكون اثنين منهم على الأقل hash).

بعبارات أخرى، hash يتطلب المواصفات التالية: إذا كانت كائنين يساويان، فإنهم hash يجب أن تكون متساوية؛ ومع ذلك، إذا كان كائنين " hash القيم تساوي، فهي ليست بالضرورة متساوين.

كإحزمة، يجب عليك دائما تجاوز isEquals و hashCode سويا او معا.

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