iOS 客户端之Objective-C | 青训营笔记

186 阅读5分钟

这是我参与「第四届青训营 」笔记创作活动的的第15天

一、前言

今天学习到的是【iOS 客户端专场 学习资料一】第四届字节跳动青训营的第二节:iOS Objective-C简介;在IOS开发中,Objective-C,通常写作ObjC或OC和较少用的Objective C或Obj-C,是扩充C的面向对象编程语言。它主要使用于Mac OS X和GNUstep这两个使用OpenStep标准的系统,而在NeXTSTEP和OpenStep中它更是基本语言,GCC与Clang含Objective-C的编译器,Objective-C可以在GCC以及Clang运作的系统上编译

二、本节课知识点大纲:

image.png

Objective-C 简介

Objective-C 语言特性

Objective-C 简介

Objective-C 是一种通用、高级、面向对象的编程语言。它扩展了标准的 ANSI C 编程语言,将 Smalltalk 式的消息传递机制加入到 ANSI C 中。目前主要支持的编译器有 GCC 和 Clang

Class的编写:介面与实现

  • 介面是由 @interface开头 与 @end,interface只是一个声明,可以声明属性, 变量和函数方法,它并不对声明的任何方法进行实现,

    • 值得注意的是,一个类它可以拥有多个 interface,你可以将不同功能的函数分散,写在多个Interface中,但必须注意,你都要有个对应的实现。
  • 实现是由 @implementation开头和@end结尾,基本上你在 interface声明的方法,都需要去做实现,否则调用这函数可能会发生崩溃,当然编译器可能都不让你通过。

    • 你可以添加interface中没有声明的函数或变量,当做私有函数,这个函数就只有这个implementation区块内可以访问。

.h 文件 和 .m文件

对应OC的代码文件,它也分为了声明文件(后坠名 .h )与实现文件(后坠名 .m),

  • 其中类的 @interface ,它可以写在 .h文件 也可以 放在 .m文件,

    • 如果放在 .h 文件,那这个介面里的声明,它就能被其他的 .h 或是 .m 引入后(也就是import),进而被调用
    • 如果放在.m 文件里,那他就只能在这个文件里的其它类调用。
  • 而 @implementation 就只能写在 .m文件里

    • 你需要在.m文件的顶部引入 .h 文件,才能在实现代码里调用其他类的函数
    • 需注意 .m文件是不能被引入的,只能引入.h,所以你想让其他.m调用方法,必须把它都声明在.h

对象与构造函数

  • 创建对象

注意 person 前面必须有个 *号,因为他是一个对象指针。

 // main.m
 #import "ByteDancer.h"
 
//注意 person 前面必须有个 *号,因为他是一个对象指针。
ByteDancer  *byteDancer1 = [[ByteDancer alloc] init];

[byteDancer1 sayHello];
int staticReturn = [ByteDancer staticFunction];
       

(override)父类默认声明的构造函数init

// ByteDancer.m
@implementation ByteDancer
// 覆盖 父类 NSObject 的 init
- (instancetype)init {
    // 注意!需要调用父类的init
    self = [super init];
    if (self) {
        self.name = @"James";
    }
    NSLog(@"A ByteDancer Joined!");
    return self;
}
@end

也可以Interface 声明一个需要参数的构造函数

// ByteDancer.h
@interface ByteDancer: NSObject
// MARK: 构造函数 - (instancetype)initWithName:(NSString *)name;
@end

// ByteDancer.m
@implementation ByteDancer
- (instancetype)initWithName:(NSString *)name {
    // 注意!需要调用父类的init
    self = [super init];
    if (self) {
        self.name = name;
    }
    NSLog(@"A ByteDancer, %@ Joined!", name);
    return self;
}
@end
 // main.m
 ByteDancer *byteDancer2 = [[ByteDancer alloc] initWithName:@"James"];

函数方法

OC的方法不管是介面还是实现一定由 加号或是减号 开头,+/- 號代表函数的類型:加號(+)代表類別方法(class method),不需要實例就可以呼叫,與C++ 的靜態函式(static member function)相似。減號(-)即是一般的實例方法(instance method)。

成员变量

变量的声明可以放在 interface中,也可以放在 implementation中,就跟方法一样取决于你是否要将这个变量供外部调用或存取,如果需要就要放在头文件的interface里让别人引入

// ByteDancer.h
@interface ByteDancer: NSObject{
    //公开变量 @public int public_int_variable; @protected double protected_double_variable; }

// ByteDancer.m
@implementation ByteDancer {
   // 私有
    int _private_int_variable;
    double _private_double_variable
}
@end
//main.m 外部访问公开成员变量
byteDancer3->_public_double_variable = 0.1;
byteDancer3->_public_int_variable = 0;
       
// ByteDancer.m 内部可以访问公开和私有的成员变量
self->_public_double_variable = 0.1;
self->_private_int_variable = 0;

Objective-C 语言特性

@property属性

基于面相对象封装性的角度,外部想要访问类中的成员变量,最好是要通过Get Set方法访问的,而不是直接访问变量,因为多个地方都能直接存取变量,会导致这个值容易错乱。

于是就有了属性,属性的语法,是在 Objective-C 2.0 才引入的用法,property已经是当前主要的变量声明方式,开发者已经不会在Interface去声明变量了

并且外部你可以透过 点符号访问属性,相等于访问对应的Get / Set 方法。

特别注意,自动声明的变量是带底线的,这就是为什么我们声明私有变量时习惯带底线。

属性特性

协议

协议的目的接近于使用父类,就是希望多个不同的类之间都有共通的方法或变量(也就是共通的介面 ),不需要每个类各自的Interface去声明方法

  • 协议声明
  • 类遵守协议 (Interface)

协议的设计

  • 协议声明 与 系统类和自定义类

方法 = 讯息传递

C++的函数调用在编译时,就已经确定了 调用A对象的C方法这个行为,基本上底层已经是一个对象方法调用的汇编代码。

引用参考:

课外补充引用:

文章学习来源:

感谢以上作者的文章,今天的学习收获满满!!Thanks and HappyCoding!