1. 变量与常量
Objective-C 使用 int、float、NSString* 等关键字声明变量,常量使用 const 声明。
int age = 30;
NSString *name = @"Alice";
注意事项:指针类型变量需使用 *,字符串常量用 @ 符号。
2. 数据类型
Objective-C 支持基本数据类型如 int、float 和 BOOL,以及类对象如 NSString、NSArray。
float height = 1.75f;
BOOL isStudent = YES;
易错点:布尔类型用 YES 和 NO。
3. 条件控制
Objective-C 支持 if、else 和 switch 条件控制。
if (age > 18) {
NSLog(@"Adult");
} else {
NSLog(@"Minor");
}
注意事项:Objective-C 的条件语句与 C 类似,NSLog 用于控制台输出。
4. 方法
Objective-C 的方法分为类方法(+)和实例方法(-)。
+ (void)classMethodExample;
- (void)instanceMethodExample:(NSString *)param;
注意事项:类方法以 + 开头,实例方法以 - 开头。
5. 类与对象
Objective-C 支持面向对象编程,类通过 @interface 和 @implementation 定义。
@interface Person : NSObject
@property (nonatomic, strong) NSString *name;
- (void)greet;
@end
@implementation Person
- (void)greet {
NSLog(@"Hello, %@", self.name);
}
@end
易错点:使用 self 访问对象属性和方法。
6. 属性与内存管理
属性通过 @property 声明,并使用 nonatomic、strong 等修饰符进行内存管理。
@property (nonatomic, strong) NSString *title;
注意事项:使用 ARC 时,strong 保留引用,weak 不保留引用。
7. 协议与委托
协议类似接口,定义一组方法,类可通过实现协议来实现功能。
@protocol MyDelegate
- (void)didCompleteTask;
@end
@interface MyClass : NSObject
@property (nonatomic, weak) id<MyDelegate> delegate;
@end
注意事项:使用 weak 防止委托循环引用。
8. 类别与扩展
类别允许在不修改原始类的情况下添加新方法,扩展用于类的私有方法。
@interface NSString (MyCategory)
- (NSString *)reversedString;
@end
@implementation NSString (MyCategory)
- (NSString *)reversedString {
return [[self reverseObjectEnumerator] allObjects];
}
@end
注意事项:类别不支持添加新实例变量。
高级与小众用法
动态方法解析
使用 resolveInstanceMethod 动态添加方法。
+ (BOOL)resolveInstanceMethod:(SEL)sel {
if (sel == @selector(myDynamicMethod)) {
class_addMethod(self, sel, (IMP)dynamicMethodIMP, "v@:");
return YES;
}
return [super resolveInstanceMethod:sel];
}
注意事项:确保方法签名正确,避免运行时错误。
消息转发
通过 forwardInvocation 实现消息转发。
- (void)forwardInvocation:(NSInvocation *)anInvocation {
if ([someObject respondsToSelector:[anInvocation selector]]) {
[anInvocation invokeWithTarget:someObject];
} else {
[super forwardInvocation:anInvocation];
}
}
注意事项:消息转发需谨慎使用,以避免性能开销。
块(Block)
块是一种内联的匿名函数,用于回调。
void (^simpleBlock)(void) = ^{
NSLog(@"Hello, Block!");
};
注意事项:避免块的强引用循环,应使用 __weak 引用外部变量。
通知中心
通知中心用于发送和接收广播事件。
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(handleEvent:)
name:@"MyEvent"
object:nil];
注意事项:记得在对象销毁前移除观察者,防止内存泄漏。
Key-Value Observing (KVO)
使用 KVO 观察属性值变化。
[self addObserver:self
forKeyPath:@"name"
options:NSKeyValueObservingOptionNew
context:nil];
注意事项:使用完后需移除观察,以免引发崩溃。
