gpt4 book ai didi

objective-c - Objective-C 中的对象是否曾经在堆栈上创建过?

转载 作者:行者123 更新时间:2023-12-04 03:02:45 24 4
gpt4 key购买 nike

据我了解,在 C++ 中,您可以在堆栈上创建对象:

SomeClass object = SomeClass();

或者在堆上:

SomeClass *object = new SomeClass();

在 Objective-C 中,您似乎总是在堆上创建对象,因为 [SomeClass alloc] 返回指向新实例的指针。这是正确的吗?

对象是否分配在栈上?如果是这样,什么将是一个很好的例子?否则,为什么不呢?

最佳答案

简短的回答是对象总是分配在堆上,而不是堆栈上。

但这还不是全部。在 Objective-C 中, block 也是完整的 Objective-C 对象。它们的特殊之处在于它们 有时在堆栈中。特别是,使用 block 文字语法创建的 block ,以及引用周围范围的 block ,都在堆栈上。如果您检查他们的类,您甚至可以看到这一点,这将是(私有(private)的)NSStackBlock。如果您使用 Block_copy()-copy 复制它们,生成的副本将在堆上 (NSMallocBlock)。

其中的一个含义是堆栈分配的 block 仅在创建它们的范围结束之前有效。在 ARC(以及早期版本的 ARC 中的 IIRC)之前,这意味着您必须复制您想要在其创建范围之外生存的 block ,以便它们位于堆上。 ARC 现在在大多数情况下都会为您处理这个问题,这也意味着一个 block 是在堆栈上还是在堆上更难预测。

这个小测试程序展示了这一点(在 ARC off 下编译):

#import <Foundation/Foundation.h>

// Compile this without ARC.

int main(int argc, char *argv[]) {
@autoreleasepool {

NSMutableString *string = [NSMutableString stringWithString:@"foo"];
void(^stackBlock)() = ^{
[string setString:@"bar"];
};
NSLog(@"stackBlock class: %@", NSStringFromClass([stackBlock class]));

void(^heapBlock)() = [[stackBlock copy] autorelease];
NSLog(@"heapBlock class: %@", NSStringFromClass([heapBlock class]));
}
}

输出:

stackBlock class: __NSStackBlock__
heapBlock class: __NSMallocBlock__

(明确一点,您当然不应该在实际代码中使用 NSStackBlock/NSMallocBlock 检查。它们是私有(private)实现细节类。这段代码是仅用于演示。)

关于objective-c - Objective-C 中的对象是否曾经在堆栈上创建过?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20663388/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com