2012-07-12 66 views
0

我已經創建了2個對象:objective-c分配的兩個對象具有相同的內存?

NSNumber * index1 = [[[NSNumber alloc] initWithInt:0 autorelease]; 
NSNumber * index2 = [[[NSNumber alloc] initWithInt:0 autorelease]; 

,並把breackpoint分配後,但令人難以置信的是,我看到相同的地址爲兩個對象:

enter image description here

和[索引1 isEqual:方法索引2 ] return always TRUE ???爲什麼?

+0

它們具有相同的值.... – Dustin 2012-07-12 15:16:03

+0

看起來像一個基本的優化:2個對象使用相同的值分享指針同時創建。如果你改變其中一個的值,它也會改變這個內存地址 – 2012-07-12 15:17:33

+0

[爲什麼NSNumber指向相同的地址,當值是等於?](http://stackoverflow.com/questions/4270121/why-nsnumber-指向同一地址當值是等於) – 2012-07-12 16:28:22

回答

4

這是一個內部優化。 NSNumbers是不可變的,所以,爲了節省空間,如果你要求一個0的NSNumber表示(以及其他一些小常量),你總會找回同一個對象。

+0

好吧,所有清除,但IMO這是一個太「積極」的優化,我需要兩個不同的對象具有相同的價值,我必須創建我自己的obj類型? – Kappe 2012-07-12 15:34:38

+0

你想要兩個不同的代表0的NSNumbers?爲什麼? – JeremyP 2012-07-12 15:37:17

+0

,因爲這兩個值0是巧合,通常有不同的值,創建後我插入這個NSNumbers在一個數組,並循環這個數組爲(NSNumber * numIndex in searchIndexes)我檢查:[numIndex isequal index1] – Kappe 2012-07-12 15:45:19

3

這是一個優化。 NSNumbers是不可變的,並且具有與另一個int值相同的整數值的NSNumber將總是與另一個相同,所以將它們作爲兩個單獨的對象是沒有意義的。這使得比較兩個NSNumbers變得微不足道,因爲您可以使用地址來檢查等價性而不是比較內部值。

相關問題