如何在NSMutableArray中获取对象的地址

时间:2014-09-22 08:56:46

标签: ios objective-c pointers

如何获取存储在NSMutableArray中的对象的地址?

我有这样的事情:

.h中的类成员变量:

MyClass *__strong*_selectedobject;

在.m:

中的函数中
MyClass *objReference = [_messageBoards objectAtIndex:idxInCaseOfContract];
_selectedobject = &objReference;
问题是,一旦函数完成,_selectedobject就是nil

_selectedobject是单例类中的实例变量。它适用于不在数组中的其他对象。此外,数组中的对象不是突然为零,它只是参考。

3 个答案:

答案 0 :(得分:2)

你无法在Objective-C中获得指向数组内部位置的指针。

如果你需要在数组中保留位置,那么如果在那里写入另一个对象,你将拥有它而不是旧的,然后保存该位置的索引(如果需要也保留数组)。请注意,对数组的修改可能会使索引无效。

如果您只需要保留此时从数组中读取的对象,只需保留该对象即可。对象地址是对象指针本身,没有额外的间接。

答案 1 :(得分:1)

更新

我只是在这里发布如何在对象中存储对地址的引用(最初的问题是关于那个),但我强烈建议任何人再次考虑是否真的需要这样做:

@interface MyClass : NSObject
{   
    NSMutableArray* test;
    __strong id* foo;
}

    *foo = [test objectAtIndex:2];

原始答案

正如@ Vijay-Apple-Dev.blogspot指出你遗漏了一些非常重要的内存 - 你正在使_selectedobject指向临时变量(objReference)的地址而不是内存中的对象([_ messageBoards objectAtIndex:idxInCaseOfContract]) 。所有方法变量在它们的方法超出范围后变为nil,这就是为什么你的引用变为nil(尽管数组仍然存在且对象存在)。只是不要使用局部变量,一切都应该没问题。

旁注 - 使用地址引用而不是对象指针的目的是什么?如果你认为你已经消失了,那么你就错了,因为ARC(和MRC也有不同的工作方式);)

答案 2 :(得分:0)

MyClass * objReference是方法的局部变量。所以一旦方法完成,一切都将从记忆中消失。如果你想保留它们,那么你将它们作为实例变量保存在头文件(.h)中。

  @property(nonatomic,retain) MyClass *objReference;

然后

  self.objReference = [_messageBoards objectAtIndex:idxInCaseOfContract];

注意:保留对象时必须使用自点语法。否则不会工作。