面试题答案
一键面试内存管理问题及处理方式
- 结构体指针为空:在方法中首先要检查传入的结构体指针是否为空,避免空指针引用导致程序崩溃。
- 内存释放:由于传入的是指针,需要明确调用方对结构体内存的管理责任。如果是调用方分配的内存,调用方负责释放;如果是在类方法内分配内存创建结构体实例,需要在适当时候释放这块内存。
关键代码示例
#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);
}
}