هل "lvalue" لا يعني ما أعتقد أنه يعني؟
-
20-09-2019 - |
سؤال
في الكود التالي:
_imageView.hasHorizontalScroller = YES;
_imageView.hasVerticalScroller = YES;
_imageView.autohidesScrollers = YES;
NSLog(@"scrollbar? H %p V %p hide %p",
&(_imageView.hasHorizontalScroller),
&(_imageView.hasVerticalScroller),
&(_imageView.autohidesScrollers));
أحصل على الخطأ:
Controller.m:143: error: lvalue required as unary '&' operand
Controller.m:144: error: lvalue required as unary '&' operand
Controller.m:145: error: lvalue required as unary '&' operand
لاحظ أنني أستخدم تلك المتغيرات ككرامات مباشرة قبل & الخطوط ...
كيف يمكن أن تشكو من أن القيمة ليست lvalue مباشرة بعد تعيينها دون أي خطأ؟ هل هذا له علاقة مع getters/المستقلبون السحريون الذي يخلقه C الهدف؟
أعتقد أنني بحاجة إلى شرح بعض السياق لشرح سبب محاولة الحصول على العنوان:
في منشورتي السابقة ، عرضت نفس الرمز ، طباعة ٪ D ووجدت أنه بعد الواجبات ، كانت الخصائص لا تزال 0 لسبب ما. لذلك ، اعتقدت أنني أحاول الحصول على عناوين الخصائص لمعرفة أين يتم تخزينها وربما يمكنني معرفة سبب عدم تعيينها بنجاح ، ثم حدث هذا.
أعتقد أنه كما ذكر الناس ، نعم ، ربما يكون ذلك عندما أقوم بالاعتزال OBJ-C يحل محله سراً مع دعوة إلى Setter (ثم بعض السحر الآخر لأنه في منشور آخر ، ذكر شخص آخر ذلك
BOOL b = [_imageView setHasVerticleScroller: YES]
فشل ، ولكن
BOOL b = _imageView.hasVerticalScroller = YES;
يعمل بشكل جيد.
المحلول
_imageView.hasHorizontalScroller = YES;
- في هذا الخط ، يمكنك الوصول إلى الخاصية في ImageView - لذلك لا يمكنك الوصول فعليًا إلى القيمة ، ولكن اتصل setter طريقة:
[_imageView setHasHorizontalScroller:YES]; // Equivalent of your code.
في المثال الثاني ، يمكنك أيضًا الوصول إلى خاصية ، ولكن يتم استدعاء طريقة Getter هذه المرة وإرجاع Bool. لذا ، كنقاط Mipadi لا تحتاج إلى استخدامه &
في بيان NSLOG.
أود أن أقترح قراءة المستندات حول الخصائص في OBJ-C.
يحرر: هنا يمكنك العثور على المناقشة حول سبب عمل الخصائص في عبارات مهمة متعددة كما ذكرت:
BOOL b = _imageView.hasVerticalScroller = YES;
نصائح أخرى
لست متأكدًا بنسبة 100 ٪ ، لكنني سأطرح طعنة في الإجابة.
هذه الخصائص كلها BOOL
الأنواع ، وهي (على ما أظن) unsigned char
في الهدف-C. (ربما int
, لا أستطيع أن أتذكر ، لكنه شيء من هذا القبيل.) لذلك أنت تحاول أخذ عنوان (&
) تلك الخصائص. لكنك لا تصل فعليًا إلى Ivars مباشرة ؛ تمر الخصائص من خلال استدعاء طريقة للحصول على قيمها. لذلك أنت تحاول الحصول على عنوان BOOL
قيمة الإرجاع للطريقة ، ولكن بما أنك لا تقوم بالفعل بتعيين القيمة إلى أي شيء ، لا يوجد عنوان - لديك فقط القيمة.
سيكون لديك نفس المشكلة إذا فعلت هذا:
static int returnOne(void)
{
return 1;
}
// Later...
NSLog(@"returnOne is %p", &returnOne()); // Oops, the return value of returnOne has no address!
يجب أن تبدو مكالمة السجل الخاصة بك هكذا:
NSLog(@"scrollbar? H %d V %d hide %d",
_imageView.hasHorizontalScroller,
_imageView.hasVerticalScroller,
_imageView.autohidesScrollers);