Objective-C:指针对应于存储的对象的实例变量

时间:2016-10-08 22:50:23

标签: ios objective-c pointers memory-management

假设我有以下类定义

public static class MyClientClass
{
    private static MarshalByRefObject remoteClass;

    static MyClientClass()
    {
        CreateRemoteInstance();
    }

    // ...

    public static void DoStuff()
    {
        // Before doing stuff, check if the remote object is still reachable
        try {
            remoteClass.GetLifetimeService();
        }
        catch(RemotingException) {
            CreateRemoteInstance(); // Re-create remote instance
        }

        // Now we are sure the remote class is reachable
        // Do actual stuff ...
    }

    private static void CreateRemoteInstance()
    {
        remoteClass = (MarshalByRefObject)AppDomain.CurrentAppDomain.CreateInstanceFromAndUnwrap(remoteClassPath, typeof(MarshalByRefObject).FullName);
    }
}

假设我在方法中有以下几行

@interface ClassX: NSObject
@property NSArray *arr;
@end

堆栈中有什么,堆中有什么?

堆栈:

堆栈中的obj。此变量的值是obj所在的堆中的位置的地址。

堆:

ClassX类型的对象

NSArray和NSArray中的NSNUmbers怎么样?它们是否也如上所述?即,指向NSArray的指针位于堆栈中,NSArray对象位于堆中?如果是,那么堆内存中包含的内容包含" obj"对象

我看到的数据是Heap中的这个内存块包含一个-(void)someMethod { ClassX *obj = [ClassX new]; obj.arr = [NSArray arrayWithObjects:[NSNumber numberWithInt:2], [NSNumber numberWithInt:3], nil]; //Edit to avoid getting derailed by differences due to @ notation } 指针,然后是实例变量。 isa指针指向isa的位置。即,这段内存包含另一个isa指针,后跟Class structure。每个结构都有一个Method structs和一个selector到相应的实现开始。

这似乎表明对象中的区域变量在堆中。即,指向NSArray对象的指针位于堆中。

修改 根据下面的答案,这是堆和堆栈中的内容的正确视图吗?

堆栈将包含4个指针,一个指向obj,一个指向NSArray,两个指向NSNumber对象。

pointer指向的地址开始的堆内存 1. obj指向ClassX类结构 2.后跟内存来存储NSArray对象。

这个NSArray对象内存有 1. isapointer指向NSArray类结构 2.后跟内存来存储2个NSNumber对象。

NSNUmber对象内存包含 1.指向NSNumber类结构的isapointer 2.后跟内存存储2个整数

1 个答案:

答案 0 :(得分:2)

NSArrayNSNumber对象都是堆分配的,而不是堆栈分配的。

它们看起来不像堆对象,因为编译器使用相对较新的语法@[]将其隐藏起来。

写作时

@[@1, @2]

编译器将其转换为

[NSArray arrayWithObjects: {[NSNumber numberWithInt:1], [NSNumber numberWithInt:2]} count: 2]

最终结果如下:堆栈有一个指向ClassX类型对象的指针。此指针指向的内存以isapointer开头,后跟指向堆中具有NSArrray对象的另一个位置的指针。反过来,堆内存的这一部分有另一个isapointer,后跟一个指向内存块的指针,该内存块代表NSArray的内部数组,包含两个指向NSNumber个对象的指针。每个NSNumber对象都有一个isapointer,后跟表示数字的数据。