سؤال

في الكود التالي:

_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);
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top