簡體   English   中英

在iOS 8.1.1中,typecast BOOL始終返回false

[英]typecast BOOL always returns false in iOS 8.1.1

我使用以下方法將BOOL值保存並檢索到字典中。

[userData setObject:@YES forKey:@"IS_AGENT"];

(BOOL) [userData objectForKey:@"IS_AGENT"];

在上面的代碼中,當重試字典中的bool值時,在以下具有iOS 8.1.1的設備iPhone5s,iPhone5c,iPhone6,iPhone6 +上,我總是會出錯,而在具有相同iOS 8.1.1的iPod Touch中,相同的代碼也可以正常工作

谷歌搜索后,我知道我們不應該這樣輸入強制轉換BOOL因為“ BOOL是一個char ,它是8位。如果您嘗試通過BOOL壓縮一個大於char的值,編譯器會很高興地截斷高位,切掉它們。”

現在,我解決了僅將boolValue消息發送到特定對象的問題。 檢查下面的工作代碼。

[[userData objectForKey:@"IS_AGENT"] boolValue];

好的,我的問題是:“為什么僅在特定設備(iPhone5s,iPhone5c,iPhone5,iPhone6 +)上而不是在具有相同iOS 8.1.1的iPod touch中發生這種情況?”

這是我的猜測,iOS 8.1.1之前發生了什么。 也許Apple改變了這里標記的指針的工作方式,但我還沒有機會對其進行測試,也沒有找到關於Apple是否在此系統中進行了某些更改的參考。

您正在將指針投射到BOOL。 由於我們在這里討論的是小端字節系統,因此將像0x12345678這樣的指針強制轉換為char產生0x78,當強制轉換為BOOL ,由於字節不為0,因此會得到1。在具有64位二進制文​​件的64位iOS系統上,運行時使用標記的指針

對於帶標記的指針,第一個字節(這是最低有效位,我們是小尾數)將始終設置最后一位,以將其標記為帶標記的指針。 如果將該字節強制轉換為BOOL,您將始終獲得1 / YES。

但是對於未標記的指針,由於對齊,最后四位始終為0。並且偶然地,它的其他位也為0(在我的測試中,我僅看到0x20的倍數,因此每8位對象將具有0x00)。 當您將其轉換為BOOL時,大多數情況下會得到YES,有時會得到NO。

如您[userData[@"IS_AGENT"] boolValue]如果您的部署目標是iOS> = 6,則查詢值的正確方法是[[userData objectForKey:@"IS_AGENT"] boolValue]或簡單地[userData[@"IS_AGENT"] boolValue]

首先,您使用的是KVC方法setValue:forKey:valueForKey:
這是一個嚴重的錯誤。

您需要使用setObject:forKey:objectForKey:NSMutableDictionary寫入/讀取對象。
另外,您正在將NSNumber強制轉換為BOOL ,這將產生意外行為。

代替該代碼,使用

    [userData setObject:@YES forKey:@"IS_AGENT"];
    BOOL isAgent = [[userData objectForKey:@"IS_AGENT"] boolValue];

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM