如何獲取該值作爲函數根據文檔返回一個指針(id)。我已經嘗試轉換爲int,int *,但是當我嘗試將它轉換爲NSLog時,我得到有關不兼容指針類型的錯誤。如果object_getIvar中的變量是基本數據類型(例如float,int,bool),如何從object_getIvar(self,myIntVar)獲取int值,因爲它返回指針
回答
獲取:
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
它可能裝箱在NSNumber中的值。您可以通過NSLogging返回的ID的類名驗證這一點,就像這樣:
id returnedValue = object_getIvar(self, myIntVar);
NSLog(@"Class: %@", [returnedValue className]);
編輯:我發現就是這樣的一個位置另一個問題:Handling the return value of object_getIvar(id object, Ivar ivar)
從我自己的實驗,這樣看來,我原來的設想是不正確的。 int和float以及其他基元似乎是作爲實際值返回的。但是,使用ivar_getTypeEncoding來驗證返回的值是您期望的類型是合適的。
您可以使用object_getInstanceVariable
直接:(沒有測試過)
void *ptr_to_result;
object_getInstanceVariable(obj, "intvarname", &ptr_to_result);
float result = *(float *)ptr_to_result;
我在第三個參數上得到了不兼容的指針時間....我不太熟悉Obj-C恐怕。文檔說它應該是一個無效的指針,這就像我認爲的ID一樣?在這種情況下,我回到了上述相同的問題.... – 2009-08-01 20:14:07
返回的值是從對象正確的位置值;只是不正確的類型。對於int
和BOOL
(但不float
),你可以只投的指針,int
或BOOL
,因爲指針和整數大小相同,它們都可以轉換爲對方:
(int)object_getIvar(obj, myIntVar)
對於ARC:
通過這個答案的啓發:object_getIvar fails to read the value of BOOL iVar。 您必須投入函數調用object_getIvar才能獲得基本類型的ivars。
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;
然後,你需要指定宏調用基本類型(例如PARAMS(長長,LONGLONG)將適合):
GET_IVAR_OF_TYPE_DEFININTION(int, Int)
在這之後用於接收INT的函數(或指定)的變量類型變得可用:
int result = XYIntGetVariableFunction(object, variableName)
- 1. object_getIvar無法讀取BOOL的Ivar
- 2. 如果bool爲真,則返回int
- 3. 如何返回一個指針INT,指出矢量<int>
- 4. 函數返回類型爲指針,爲什麼不是如int,而返回變量
- 5. 如何獲取JTextField爲int並返回?
- 6. 返回範圍如果類型是指針,函數的值
- 7. 是否可以使用一行命令將[int,bool,float]轉換爲['int','bool','float']?
- 8. 如何將std :: wstring轉換爲數值類型(int,long,float)?
- 9. 如何從onActivityResult(int requestCode,int resultCode,Intent數據)獲取結果?
- 10. 轉換int類型數組爲char,返回內存指針
- 11. 如何訪問併爲結構體上的int指針數據類型賦值?
- 12. 函數返回指向int的指針
- 13. 從查詢返回int值的int型函數的返回值是什麼
- 14. 如何不返回任何返回類型爲int的方法
- 15. 爲什麼python statistics.mean()返回一個int類型,而不是float
- 16. 如何獲取指定爲結構類型的指針變量的值
- 17. 如何區分一個類的實例和普通數據類型int/bool/float/etc
- 18. 從數據庫獲取int類型c#
- 19. C++如何將int整型爲float/double?
- 20. 爲炭返回類型/ INT
- 21. 如何檢查用戶輸入的變量是數字(int,float)?
- 22. Haskell:如何定義實例Show Set的類型Set = Int - > Bool
- 23. 如何返回指定返回值的子類型(在本例中爲interface {})?
- 24. 如何將變量的值轉換爲模型中的int值?
- 25. 如何從int指針獲取數據到c#中的內存流?
- 26. 如果給定的int是2的指數,則返回#
- 27. char *指向一個int值,如何獲取int值?
- 28. ASP.NET:如果我的sql數據類型是float,什麼是DataReader返回類型?
- 29. 從C++中的int指針返回一個只讀指針
- 30. 如何將int []類型轉換爲int?[]
當我嘗試調用[returnedValue的className]我得到警告沒有找到方法className。然後,我嘗試使用object_getClassName(object_getIvar(self,myIntVar))(myIntVar實際上是分配在一個for循環,所以它改變),循環執行一次,然後我最終在GDB,但沒有記錄錯誤。唯一被記錄的值是'零'...想法? – 2009-08-01 20:01:03
@Russel我正在研究它並試驗。如果我想出任何東西,我會編輯我的答案。 – 2009-08-01 21:04:06
Jacob讓它使用object_getInstanceVariable工作,但我仍然很好奇如何讓object_getIvar工作,因爲它明顯更快(http://developer.apple.com/documentation/Cocoa/Reference/ObjCRuntimeRef/Reference/reference.html #// apple_ref/c/func/object_getIvar)嘗試在網絡上搜索使用它的示例,但沒有人似乎將它用於基本類型。 – 2009-08-02 04:03:17