objective-c - Objective C 在栈上分配对象

标签 objective-c object stack

我是 Objective C 的新手,正在做一些对象练习。虽然像 Fraction* f = [[Fraction alloc] init ]; 这样的东西有效,但每当我尝试做 Fraction c; 我得到 Interface type cannot be statically allocated 是否有在堆栈上分配对象的方法(就像在 C++ 中一样)?还是我做错了事?

最佳答案

从技术上讲,您可以(参见下面的代码),但您不应该这样做。此外,无论是在堆栈中还是在堆中,您只有一个指向对象的指针,而不是对象本身。也就是说,您应该编写 Fraction *c,而不是 Fraction c

// Allocate an Objective-C object on the stack.
// Original code By Graham Lee: 
// https://gist.github.com/iamleeg/5290797     

#import <Foundation/Foundation.h>
#include <stdlib.h>
#include <objc/runtime.h>

@interface A : NSObject
@property (assign) int meaning;
@end

@implementation A

- (id)init {
    if ([super init]) {
        _meaning = 42;
    }
    return self;
}

@end


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

        // allocate and zero stack memory
        size_t size = class_getInstanceSize([A class]);
        id obj = (__bridge_transfer id) alloca(size);
        memset((__bridge void*)obj, 0, size);

        // set class and initialize the object
        object_setClass(obj, [A class]);
        obj = [obj init];

        NSLog(@"meaning: %d", [obj meaning]);

        // transfer ownership from ARC to CF so ARC doesn't 
        // try to improperly free the stack allocated memory
        CFTypeRef ref = (__bridge_retained CFTypeRef) obj;
    }
}

alloca() 是非标准的、不安全的、不可移植的,并且容易出现堆栈溢出。

关于objective-c - Objective C 在栈上分配对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12423627/

相关文章:

javascript - 根据另一个对象数组过滤对象数组并返回合并数组

安卓初始化动画

stack - 如何设计零地址机

ios - 如何 Hook subview 的 subview ?

ios - 使用带有完成处理程序的循环在多个节点上使用单个 SKAction 动画

iphone - UITableView 分组显示每个部分的新信息

ios - 如何使用 [camera takePhoto] 并使用 UIImagePicker 进行编辑 - UIImagePickerController.allowsEditing = YES

javascript - 使用 "new"声明变量与不使用它有什么区别?

c++ - (C++) 无法从我的堆栈对象调用 push() 和 pop()

assembly - 在 Arm 中,参数在堆栈中存储的顺序是什么?