كيف يمكنني الحصول على قيمة عدد صحيح من object_getIvar (النفس، myIntVar) لأنه يعود مؤشر

StackOverflow https://stackoverflow.com/questions/1217139

سؤال

وإذا كان المتغير في object_getIvar هو نوع البيانات الأساسية (على سبيل المثال. تعويم، الباحث، منطقي) كيف يمكنني الحصول على القيمة كما ترجع الدالة مؤشر (معرف) وفقا للوثائق. لقد حاولت الصب إلى int، كثافة العمليات * ولكن عندما أحاول الحصول على هذا لNSLog، وأحصل على خطأ حول نوع مؤشر غير متوافق.

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

المحلول

على الحصول على : ل

myFloat = 2.34f;

float myFloatValue;
object_getInstanceVariable(self, "myFloat", (void*)&myFloatValue);

NSLog(@"%f", myFloatValue);

والمخرجات:

<اقتباس فقرة>   

و2.340000

على إعداد : ل

float newValue = 2.34f;
unsigned int addr = (unsigned int)&newValue;

object_setInstanceVariable(self, "myFloat", *(float**)addr);

NSLog(@"%f", myFloat);

والمخرجات:

<اقتباس فقرة>   

و2.340000

نصائح أخرى

لARC:

وبوحي من هذه الإجابة: object_getIvar فشل في قراءة قيمة BOOL ايفار . عليك أن يلقي استدعاء دالة لobject_getIvar للحصول على نوع الأساسي إيفارس.

typedef int (*XYIntGetVariableFunction)(id object, const char* variableName);
XYIntGetVariableFunction intVariableFunction = (XYIntGetVariableFunction)object_getIvar;
int result = intVariableFunction(object, intVarName);

ولقد جعلت ماكرو مفيد صغير لتعريف سريع لهذه المؤشرات الدالة:

#define GET_IVAR_OF_TYPE_DEFININTION(type, capitalized_type) \
typedef type (*XY ## capitalized_type ## GetVariableFunctionType)(id object, Ivar ivar); \
XY ## capitalized_type ## GetVariableFunctionType XY ## capitalized_type ## GetVariableFunction = (XY ## capitalized_type ## GetVariableFunctionType)object_getIvar;

وبعد ذلك، لأنواع الأساسية التي تحتاج إلى تحديد المكالمات إلى الماكرو (بارامس مثل (طويلة طويلة، LONGLONG) سيكون مناسبا):

GET_IVAR_OF_TYPE_DEFININTION(int, Int)

وبعد أن وظيفة لاستقبال الباحث (أو معين) نوع متغير تصبح متاحة:

int result = XYIntGetVariableFunction(object, variableName)

والقيمة التي يتم إرجاعها هي القيمة من المكان الصحيح في وجوه؛ ليس فقط الحق في نوع. لint وBOOL (ولكن ليس float)، هل يمكن أن مجرد يلقي مؤشر إلى int أو BOOL، منذ مؤشرات و[إينتس] هي نفس الحجم، ويمكن أن يلقي لبعضها البعض:

(int)object_getIvar(obj, myIntVar)

وانها ربما الملاكمة القيمة في NSNumber. يمكنك التحقق من ذلك عن طريق NSLogging اسم_الفئة هوية عاد، ومثل ذلك:

id returnedValue = object_getIvar(self, myIntVar);
NSLog(@"Class: %@", [returnedValue className]);

وتحرير: لقد وجدت سؤال آخر تماما مثل هذا واحد هنا: التعامل مع قيمة الإرجاع object_getIvar (كائن الهوية، وايفار ايفار)

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

ويمكنك استخدام object_getInstanceVariable مباشرة: (لم نجرب ذلك)

void *ptr_to_result;
object_getInstanceVariable(obj, "intvarname", &ptr_to_result);
float result = *(float *)ptr_to_result;
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top