2015-10-15 45 views
1

在我的頭文件中,我聲明瞭一些變量@property (nonatomic) NSInteger *soldWindows;並用它們跟蹤計數,並用_soldWindows++;遞增。結果始終出現了8倍。我發現我的問題是將它聲明爲指針,所以我將其更改爲@property (nonatomic) NSInteger soldWindows;,這解決了我的問題。爲什麼指向NSInteger的指針將值乘以8?

我的問題是,如果它只是存儲一個內存地址,爲什麼整數值縮小8,而不是一個任意地址?

+1

除了ChrisCM的正確答案之外,似乎並沒有什麼特別的原因讓你使用NSInteger。所以簡單地使用一個int intead。 – fishinear

+1

@fishinear根據目標,'NSInteger'是int或long的類型定義。那麼切換到「int」的好處是什麼? –

+3

@fishinear不好的建議。 – rmaddy

回答

5

指針指向內存中的某個位置。當你像這樣增加一個指針時,你會增加指針的值,指向內存中的新位置。鑑於此,可以使用指針算術通過取消引用增加的指針來遍歷數組中的連續元素。所以,你不是遞增1,而是按你指針類型的大小遞增。一個NSInteger只不過是一個64或32位int,具體取決於平臺。在這種情況下,它似乎是64位,即8個字節。這是你的8位「縮放」來自哪裏。

結論:您的修復是正確的!

+0

你的解釋是正確的。這個例子相當混亂(如果意味着實際的代碼錯誤)。 –

+1

「當你增加它指向的內存中的位置時」聽起來像指針增加了,而不是指針。那將是錯誤的。指針中的地址遞增,而不是內存中的地址。 –

0

我聲明瞭一些變量,如NSInteger * soldWindows;並用它們來跟蹤計數。

您正在濫用指針的概念。在C中,指針是內存中對象的地址。在你的用例中沒有指向的對象 - 只是指向無處的地址。

雖然這不是一個問題,只要你不取消引用指針,它仍然是令人困惑的(並沒有任何幫助)。一個簡單的整數(如intNSInteger)是更好的選擇。

爲什麼整數值按8縮放?

其原因被稱爲指針運算。每個C指針都有一個類型。該類型描述指針保存地址的內存中的對象。當您增加一個指針時,編譯器實際上會將該對象的大小添加到指針中,以便它指向上一個之後的對象。

NSInteger(在64位iOS中)的大小是64位= 8字節。這就是爲什麼遞增NSInteger *實際上增加了8個。

+1

@ChrisCM我假設OP使用指針作爲它的值(可能初始化爲'NULL'左右)。他看到8步的增量值,因此他將指針值用作積分標量值。我不認爲他實際上指向了什麼(除了虛擬內存中的隨機地址外,這就是我的意思是「沒有」)。解引用指針將是未定義的行爲。 –

相關問題