ما هو isobject isequal: وظيفة التجزئة الافتراضية؟
-
12-09-2019 - |
سؤال
لدي فئة نموذج قاعدة البيانات أي NSObject
. وبعد لدي مجموعة من هذه الكائنات في NSMutableArray
. وبعد أنا أستعمل indexOfObject:
للعثور على المباراة. المشكلة هي تغييرات عنوان ذاكرة الكائن النموذجي. لذلك أنا تجاوز hash
طريقة لإرجاع معرف صف النموذج. هذا ولكن لا يصلحه. يجب أن أتجاوز isEqual:
طريقة لمقارنة قيمة hash
طريقة.
ماذا يكون ال isEqual:
استخدام الأسلوب لتحديد المساواة افتراضيا؟
أنا أفترض أنه يستخدم عنوان الذاكرة. بعد قراءة isEqual:
وثائق اعتقدت أنها استخدمت القيمة من hash
طريقة. من الواضح أن هذا ليس هو الحال لأن محاولتي لتجاوز هذه القيمة لم تحل مشكلتي الأولية.
المحلول
كما كنت خمنت بشكل صحيح، NSObject
الافتراضي isEqual:
السلوك يقارن عنوان ذاكرة الكائن. الغريب، هذا ليس موثقا حاليا في إشارة فئة NSOBJECT, ، ولكن تم توثيقها في استبطان - سبر غور الوثائق، التي تنص:
الافتراضي
NSObject
بداية شئisEqual:
ما عليك سوى التحقق من المساواة مؤشر.
بالطبع، كما تعلمون بلا شك، فئات فرعية من NSObject
يمكن تجاوز isEqual:
أن تتصرف بشكل مختلف. علي سبيل المثال، NSString
'س isEqual:
الطريقة، عندما مرت آخر 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
سويا او معا.