Objective-C 简介 | 青训营笔记

112 阅读2分钟

这是我参与「第四届青训营 」笔记创作活动的的第1天。
以下是第一天学习 Objective-C 的笔记。

一、Xcode 工程体系介绍

  • Workspace & Project
  • Target
  • Product

二、Objective-C 简介

Class的编写:介面与实现

  • interface区可以写声明代码,包括变量和方法的声明
  • implementation区可以写实现代码,主要是interface区声明的方法对应的实现代码

.h文件和 .m文件

  • 类的介面可以写在 .h文件,也可以放在 .m文件
    • 如果放在 .h 文件,那这个介面里的声明能被其他的 .h 或是 .m 引入及调用
    • 如果放在 .m 文件里,只能在这个文件里的其它类调用
  • 实现只能写在 .m文件里
    • 需要在 .m文件的顶部引入 .h 文件,才能在实现代码里调用其他类的函数
    • .m文件是不能被引入的,只能引入 .h,想让其他 .m调用方法,必须把它都声明在 .h

对象与构造函数

  1. 创建对象

    // main.m
    #import "MyClass.h"
    
    //注意 myClass 前面必须有个 * 号,因为他是一个对象指针
    MyClass *myClass = [[MyClass alloc] init];
    
  2. 重写父类默认声明的构造函数init

    // MyClass.m
    @implementation MyClass
    // 覆盖父类 NSObject 的 init
    - (instancetype)init {
        self = [super init];
        if (self) {
            self.name = @"James";
        }
        NSLog(@"A MyClass Joined!");
        return self;
    }
    @end
    
  3. 可以声明一个需要参数的构造函数

    // MyClass.h
    @interface MyClass: NSObject
    // 构造函数
    - (instancetype)initWithName:(NSString *)name;
    @end
    
    // MyClass.m
    @implementation MyClass
    - (instancetype)initWithName:(NSString *)name {
        self = [super init];
        if (self) {
            self.name = name;
        }
        NSLog(@"A MyClass, %@ Joined!", name);
        return self;
    }
    @end
    

函数方法

  1. 方法类型(+类方法 / -实例方法)

  2. 声明与实现

    // MyClass.h
    @inteface MyClass: NSObject
    // 函数声明
    - (void)sayHello;
    // (回传值)方法名:(参数1类型)参数1 标签:(参数2类型)参数2
    - (void)groupWith:(NSString *)name;
    // 返回对象
    - (MyClass *)groupWith:(NSString *)name andWith:(NSString *)name2;
    // 类方法(静态函数)
    + (int)staticFunction;
    @end
    
    // MyClass.m
    @implementation MyClass
    // 函数实现,与 Interface一一对应,但完成函数主体实现
    - (void)sayHello {
        NSLog(@"Hi");
    }
    - (void)groupWith:(NSString *)name {
        NSLog(@"Hi, I'm group with %@", name);
    }
    - (MyClass *)groupWith:(NSString *)name andWith:(NSString *)name2 {
        MyClass *group = [[MyClass alloc] initWithName:
        [NSString stringWithFormat:@"%@,%@,%@", self.name, name, name2]];
        return group;
    }
    // 类方法(静态函数)
    + (int)staticFunction {
        return 0;
    }
    @end
    
  3. 方法调用

    // main.m
    #import "MyClass.h"
    
    MyClass *myClass = [[MyClass alloc] initWithName:@"James"];
    // 实例方法
    [myClass sayHello];
    // 实例方法 - 多参数, 返回对象
    [[myClass groupWith:@"Andy" andWith:@"Amy"] sayHello]; //第一个函数返回对象后再调用
    
    // 类方法 (静态函数)
    int staticReturn = [MyClass staticFunction];
    

成员变量

  1. interface变量

    // MyClass.h
    @inteface MyClass: NSObject {
        // 公共变量
        @public int public_int_variable;
        @protected double protected_double_variable;
    }
    @end
    
  2. implementation变量

    // MyClass.m
    @implementation MyClass {
        // 私有
        int _private_int_variable;
        double _private_double_variable;
    }
    @end
    
  3. 调用

    // 外部访问公开成员变量
    MyClass->_public_double_variable = 0.1;
    MyClass->_public_int_variable = 0;
    
    // MyClass.m 内部可以访问公开和私有的成员变量
    self->_public_double_variable = 0.1;
    self->_private_int_variable = 0;
    

三、Objective-C 语言特性

属性 @property

// MyClass.h
@interface MyClass: NSObject
@property (nonatomic, copy) NSString* name;
@end
// 声明属性等于以下代码
// MyClass.h
@interface MyClass: NSObject
// Get / Set 方法
- (void)setName:(NSString *)name;
- (NSString *)name;
@end

// MyClass.m
@implementation MyClass {
    // 自动声明变量 (带底线)
    NSString *_name;
}
- (void)setName:(NSString *)name {
    self->_name = name;
}
- (NSString *)name {
    return _name;
}
@end