سؤال

أحاول أن أفهم الغرض من synthesize التوجيه مع الاسم الممتلكات المبالغة. قل أن لدي واجهة محددة على النحو التالي:

@interface Dummy ... {
    UILabel *_dummyLabel;
}

@property (retain, nonatomic) UILabel *dummyLabel;

وفي ملف التنفيذ ، لدي:

@synthesize dummyLabel = _dummyLabel;

من ما أفهمه ، "Dummylabel" هو مجرد اسم مستعار لمتغير المثيل "_dummylabel". هل هناك أي فرق بين self._dummylabel و self.dummylabel؟

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

المحلول

نعم. self._dummyLabel غير محدد ، ولكن _dummyLabel ليس.

يوسع بناء الجملة DOT إلى دعوات طريقة بسيطة ، لذلك فهو ليس خاصًا بالخصائص. إذا كان لديك طريقة تسمى -(id)someObject, ، على سبيل المثال في حالة object.someObject, ، سيكون كما لو كتبت [object someObject];.

self.dummyLabel  //works
self._dummyLabel //does not work
dummyLabel       //does not work
_dummyLabel      //works
[self dummyLabel];  //works
[self _dummyLabel]; //does not work

نصائح أخرى

فهمك غير صحيح. dummyLabel هو اسم العقار ، وهو ليس الاسم المستعار لمتغير المثيل - متغير المثيل هو فقط اتصل _dummyLabel. لذا فإن ما يلي يحمل مثيلًا Dummy اتصل myObject:

  • [myObject dummyLabel] يعمل
  • myObject.dummyLabel يعمل
  • [myObject _dummyLabel] فشل
  • myObject._dummyLabel فشل
  • myObject->dummyLabel فشل
  • myObject->_dummyLabel يعتمد على رؤية IVAR (@public, @private, @protected)
  • [myObject valueForKey: @"dummyLabel"] يعمل
  • [myObject valueForKey: @"_dummyLabel"] يعتمد على تنفيذ +accessInstanceVariablesDirectly (أي ستعمل في الحالة الافتراضية حيث +accessInstanceVariablesDirectly عائدات YES).

ميزة الحصول على اسم آخر لـ IVAR أكثر من الخاصية هي أنه يمكنك رؤيته بسهولة في الكود عند الوصول إلى واحد أو آخر - Andre K

لا أستطيع العثور على زر "تعليق" ، لذا فأنا أضطر إلى النشر كـ "إجابة".

أردت فقط التوسع في تعليق Andre - من خلال معرفة متى تستخدم الخصائص المتوازنة مقابل متغير الفانيليا ، كما تعلمون (خاصة في حالة المستوطنين) عندما يتم الاحتفاظ بالمتغير/نسخه/إصداره تلقائيًا بفضل جهازك اللطيف ، مقابل الوجود معالجة باليد.

بالطبع إذا كنت تفعل الأشياء بشكل صحيح ، فربما لا تحتاج إلى مساعدة من جهاز للاحتفاظ/إصدار الكائنات بشكل صحيح! ولكن يمكن أن يكون هناك سيناريوهات أخرى أيضًا حيث تشير إلى Ivars الخاص بك self.ivar بدلاً من _ivar يمكن أن تكون مفيدة ، مثل عندما تستخدم المستقلين المخصصين/getters بدلاً من تلك التي تم توليفها الافتراضي. ربما في كل مرة تقوم فيها بتعديل خاصية ، فأنت تريد أيضًا تخزينها إلى NSUSERDEFAULTS. لذلك قد يكون لديك بعض التعليمات البرمجية مثل هذا:

@interface SOUserSettings : NSObject {

BOOL _autoLoginOn;

}

@property (nonatomic, assign) BOOL autoLoginOn;

@end

@implementation SOUserSettings

@synthesize autoLoginOn = _autoLoginOn;

- (void)setAutoLoginOn:(BOOL)newAutoLoginOnValue {

   _autoLoginOn = newAutoLoginOnValue;
   [[NSUserDefaults standardUserDefaults] setBool:_autoLoginOn forKey:@"UserPrefAutoLoginOn"];
}

@end

ملاحظة: هذا مجرد رمز توضيحي ، يمكن أن يكون هناك ألف شيء خاطئ في ذلك!

حتى الآن ، في الكود الخاص بك ، إذا كان لديك سطر يقول _autoLoginOn = YES - أنت تعلم أنه لن يتم حفظه في NSUSERDEFAULTS ، بينما إذا كنت تستخدم self.autoLoginOn = YES أنت تعرف بالضبط ما الذي سيحدث.

الفرق بين _autoLoginOn و self.autoLoginOn أكثر من مجرد دلالي.

لا أرى أي ميزة كبيرة لإعادة تسمية _dummylabel إلى dummylabel

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

قد يكون من المفيد أيضًا إذا كنت بحاجة إلى الحفاظ على واجهة قديمة مع مجموعة واحدة من الأسماء في نفس الوقت مثل مجموعة جديدة من واجهات برمجة التطبيقات مع مجموعة جديدة من الأسماء (SetLastName مقابل SetSurname).

Post Old ، لكنني أعتقد أنه من المهم أن نذكر ، أنه يوصى بالوصول إلى المتغيرات عبر getters والمستقبين (لذلك ، مع تدوين DOT). يوصى بقوة بالوصول إلى حقل مباشرة (_ivar) فقط عند تهيئته.

هناك بعض مقالة Apple الجيدة:https://developer.apple.com/library/ios/#documentation/cocoa/conceptual/programmingwithobjectivec/encapsulatingdata/encapsulatingdata.html

الفقرة الأخيرة:

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

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