假设我有以下类定义
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个整数
答案 0 :(得分:2)
NSArray
和NSNumber
对象都是堆分配的,而不是堆栈分配的。
它们看起来不像堆对象,因为编译器使用相对较新的语法@[]
将其隐藏起来。
写作时
@[@1, @2]
编译器将其转换为
[NSArray arrayWithObjects: {[NSNumber numberWithInt:1], [NSNumber numberWithInt:2]} count: 2]
最终结果如下:堆栈有一个指向ClassX
类型对象的指针。此指针指向的内存以isapointer开头,后跟指向堆中具有NSArrray
对象的另一个位置的指针。反过来,堆内存的这一部分有另一个isapointer,后跟一个指向内存块的指针,该内存块代表NSArray
的内部数组,包含两个指向NSNumber
个对象的指针。每个NSNumber
对象都有一个isapointer,后跟表示数字的数据。