MST
星途 面试题库

面试题:Objective - C与C语言结构体交互的内存管理

在Objective - C项目中有一个C语言结构体`typedef struct { int value1; double value2; } MyStruct;`,创建一个Objective - C类`MyClass`,其中有一个实例方法接收这个结构体指针,并对结构体成员进行操作。阐述在这个过程中,可能出现的内存管理问题以及如何正确处理,同时写出关键的代码示例。
22.8万 热度难度
编程语言Objective-C

知识考点

AI 面试

面试题答案

一键面试

内存管理问题及处理方式

  1. 结构体指针为空:在方法中首先要检查传入的结构体指针是否为空,避免空指针引用导致程序崩溃。
  2. 内存释放:由于传入的是指针,需要明确调用方对结构体内存的管理责任。如果是调用方分配的内存,调用方负责释放;如果是在类方法内分配内存创建结构体实例,需要在适当时候释放这块内存。

关键代码示例

#import <Foundation/Foundation.h>

typedef struct { 
    int value1; 
    double value2; 
} MyStruct;

@interface MyClass : NSObject
- (void)operateOnStruct:(MyStruct *)structPtr;
@end

@implementation MyClass
- (void)operateOnStruct:(MyStruct *)structPtr {
    if (structPtr == nil) {
        NSLog(@"传入的结构体指针为空");
        return;
    }
    structPtr->value1 += 1;
    structPtr->value2 *= 2;
}
@end

在调用端:

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        MyStruct myStruct = {10, 5.5};
        MyStruct *structPtr = &myStruct;
        MyClass *myClass = [[MyClass alloc] init];
        [myClass operateOnStruct:structPtr];
        NSLog(@"value1: %d, value2: %f", myStruct.value1, myStruct.value2);
        [myClass release];
    }
    return 0;
}

如果在MyClass方法内分配结构体内存,例如:

- (void)createAndOperate {
    MyStruct *newStruct = (MyStruct *)malloc(sizeof(MyStruct));
    if (newStruct) {
        newStruct->value1 = 20;
        newStruct->value2 = 3.3;
        newStruct->value1 += 1;
        newStruct->value2 *= 2;
        NSLog(@"value1: %d, value2: %f", newStruct->value1, newStruct->value2);
        free(newStruct);
    }
}