面试题答案
一键面试代码实现
C语言部分(假设为point.h
)
// point.h
#ifndef POINT_H
#define POINT_H
typedef struct {
int x;
int y;
} Point;
// C函数声明,用于接收Point结构体
void printPoint(Point p);
#endif
// point.c
#include <stdio.h>
#include "point.h"
void printPoint(Point p) {
printf("Point x: %d, y: %d\n", p.x, p.y);
}
Objective-C部分(假设为ViewController.m
)
#import "ViewController.h"
#import "point.h"
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
// 创建Point结构体实例
Point myPoint = {10, 20};
// 传递给C函数
printPoint(myPoint);
// 调用类方法获取结构体实例
Point returnedPoint = [self getPoint];
printPoint(returnedPoint);
}
+ (Point)getPoint {
Point p = {30, 40};
return p;
}
@end
内存管理问题及解决方案
-
内存管理问题:在这种混合编程场景下,
Point
结构体是在栈上分配内存的。因为它是一个简单的C结构体,不涉及动态内存分配(如malloc
等),所以不存在手动释放内存的问题。 -
解决方案:由于
Point
结构体在栈上分配和释放,只要遵循正常的栈内存管理规则即可。例如,在函数内部创建的结构体实例,当函数结束时,其内存会自动被系统回收。在传递结构体实例给C函数或者从Objective-C类方法返回结构体实例时,都是按值传递,不需要额外的内存管理操作。
注意:如果Point
结构体中包含了需要动态分配内存的成员(如char *
类型且使用malloc
分配内存),那么就需要在适当的地方手动释放内存,以避免内存泄漏。例如,如果Point
结构体变为:
typedef struct {
int x;
int y;
char *name;
} Point;
则在使用完Point
实例后,需要手动释放name
所指向的内存:
void freePoint(Point p) {
free(p.name);
}
在Objective-C中使用完Point
实例后调用此函数释放内存。