2014-01-24 248 views
-2

你能澄清我以下: 我对象 - 将对象添加到数组

NSMutableArray *_array;

...

_array = [[NSMutableArray alloc] initWithCapacity:20]; 

MyClassItem *item; 
item = [[MyClassItem alloc] init]; 

item.a = @"a"; 
item.b = @"b"; 
[_array addObject:item]; 

item.a = @"a1"; 
item.b = @"b1"; 
[_array addObject:item]; 

在这种情况下,我收到_array两个相似的物体, 项目[0] == .A item [1] .a == @“a1” 但我认为item [0] .a应该是@“a”...

我知道如果每次添加它之前都要初始化item排列,一切都会好的,

MyClassItem *item; 
item = [[MyClassItem alloc] init]; 

item.a = @"a"; 
item.b = @"b"; 
[_array addObject:item]; 

item = [[MyClassItem alloc] init];//If I add this line, everything is OK 

item.a = @"a1"; 
item.b = @"b1"; 
[_array addObject:item]; 

我想这样 - 我有一个对象,我修改它的属性,并添加到数组后,我再次修改它的属性并将其添加到数组,但如果它只把指针指向它的对象,为什么我用相同对象的init修复它?

发生在第一次init期间分配的内存?

希望你明白我的挫折)

+0

指针,你需要了解指针。 http://www.techotopia.com/index.php/Pointers_and_Indirection_in_Objective-C – sbarow

+0

我真的不认为这种初学者问题应该被降低。我们都从某个地方开始,问题本身没有任何错误。对于几乎所有的开发人员来说,他所要求的内容都很清晰,对某些人来说这很容易 - 这可能确实令人头疼。 – avuthless

回答

0

您有一个对象,它由指针item引用。首先将item.a分配为@"a",然后将其a属性更改为@"a1"。不过,这两次都是同一个对象。要创建另一个MyClassItem,您必须再次编写item = [[MyClassItem alloc] init]。这是创建对象的分配。

+0

很明显,tx,但是第一次启动时分配的内存会发生什么? –

+0

@ S.ork:好问题。那么,在你重新分配变量之前,对象需要被释放,否则对象将被泄漏,你永远无法释放内存。如果你使用ARC(这似乎是大多数人现在所做的),ARC会为你自动发布一个版本。否则,你需要自己做。 – Chuck

1

在您更改了相同的对象尚属首例。该数组包含两个指向内存中相同位置的指针。知道如何指针工作回答你的问题。在第二个示例中,您将创建一个新对象(第一个对象由数组保留并且不会丢失),然后获得正确的不同属性。

0

这是因为你对item的存储位置,每当点更新item,对存储位置更新的数据和item,而不是他们的价值你_array商店内存位置。

但是如果你分配新的内存,那么在两个不同的内存位置上有两个item的副本,这就是为什么当你更新第二个内存位置时,第一个内存位置没有改变。

0

为了理解这个,你需要知道对象和指向对象的指针有什么区别。

对象是实际的对象及其所有数据。指针是一个信息,在内存中存在对象,并允许您访问该对象。更多检查C中变量名称前的含义*

在objc中,只能有指向对象的指针。所以在这种情况下,这是发生了什么。

_array = [[NSMutableArray alloc] initWithCapacity:20]; 

MyClassItem *item; 
item = [[MyClassItem alloc] init]; //here object is created, pointer to it is stored in 'item' 

item.a = @"a"; //you manipulate that object 
item.b = @"b"; 
[_array addObject:item]; //here pointer to it is added to array. Object is not copied, array will contain a pointer pointing at initial item. So item and _array[0] is not two different objects - it's one object. 

item.a = @"a1"; //and you are modifying this object 
item.b = @"b1"; 
[_array addObject:item];