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];
注意事项:使用完后需移除观察,以免引发崩溃。