面试题答案
一键面试- 类型转换与内存管理原则:
- 在Objective - C中,使用
id
类型可以指向任何对象。当将id
指针转换为MyClass *
类型时,需要确保指向的实际对象确实是MyClass
类型或者是MyClass
的子类类型,以避免类型不匹配错误。 - 内存管理方面,在ARC(自动引用计数)环境下,系统会自动处理对象的引用计数增减,无需手动调用
retain
、release
等方法。在MRC(手动引用计数)环境下,则需要开发者手动管理对象的引用计数。
- 在Objective - C中,使用
- 示例代码(ARC环境):
#import <Foundation/Foundation.h>
@interface MyClass : NSObject
@property (nonatomic, strong) NSString *name;
- (void)printName;
@end
@implementation MyClass
- (void)printName {
NSLog(@"Name: %@", self.name);
}
@end
int main(int argc, const char * argv[]) {
@autoreleasepool {
MyClass *myObject = [[MyClass alloc] init];
myObject.name = @"Test Name";
id genericObject = myObject;
// 安全转换
if ([genericObject isKindOfClass:[MyClass class]]) {
MyClass *convertedObject = (MyClass *)genericObject;
[convertedObject printName];
}
}
return 0;
}
- 示例代码(MRC环境):
#import <Foundation/Foundation.h>
@interface MyClass : NSObject
@property (nonatomic, retain) NSString *name;
- (void)printName;
@end
@implementation MyClass
- (void)printName {
NSLog(@"Name: %@", self.name);
}
- (void)dealloc {
[_name release];
[super dealloc];
}
@end
int main(int argc, const char * argv[]) {
@autoreleasepool {
MyClass *myObject = [[MyClass alloc] init];
[myObject setName:@"Test Name"];
id genericObject = myObject;
// 安全转换
if ([genericObject isKindOfClass:[MyClass class]]) {
MyClass *convertedObject = (MyClass *)genericObject;
[convertedObject printName];
// 手动释放对象
[convertedObject release];
}
}
return 0;
}
在上述代码中,无论是ARC还是MRC环境,都通过isKindOfClass:
方法来检查id
指针指向的对象是否是MyClass
类型或其子类类型,以确保类型转换的安全性。在MRC环境下,注意手动释放对象以防止内存泄漏。同时,避免出现悬空指针需要在对象释放后将指针设置为nil
。例如,在MRC环境下,如果在释放convertedObject
后,后续代码中不再使用它,可以将其设置为nil
:
[convertedObject release];
convertedObject = nil;
这样可以防止误操作访问已释放对象的内存,从而避免悬空指针问题。