Objective-C 编程学习笔记

1. 变量与常量

Objective-C 使用 intfloatNSString* 等关键字声明变量,常量使用 const 声明。

int age = 30;
NSString *name = @"Alice";

注意事项:指针类型变量需使用 *,字符串常量用 @ 符号。

2. 数据类型

Objective-C 支持基本数据类型如 intfloatBOOL,以及类对象如 NSStringNSArray

float height = 1.75f;
BOOL isStudent = YES;

易错点:布尔类型用 YESNO

3. 条件控制

Objective-C 支持 ifelseswitch 条件控制。

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 声明,并使用 nonatomicstrong 等修饰符进行内存管理。

@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];

注意事项:使用完后需移除观察,以免引发崩溃。