Objective-c:OC语言简介、类与对象

Objective-c 简介

  • 1980年代初,Brad Cox发明了Objective-C;

  • 1985年乔布斯成立了NeXT公司,创建了NextSTEP,使用Objective-C开发的用户界面工具包;

  • 1996年,苹果公司收购NeXT公司,NextSTEP被重新命名为Cocoa,应用在了Macintosh编程上;

  • 2007年,iPhone发布,Objective-C又是iOS平台软件开发的语言,直到2010年,iphone4的推出,将苹果公司置于科技界顶峰,Objective –C也越来越多的人学习;

  • Objective-C是C语言的扩展集:

    • 封闭的编程语言

    • 动态语言

  • Objective-C与C的不同点:

    • Objective-C是面向对象的语言,C是面向过程的语言;

    • 解决同样的问题,面向对象与面向过程分别使用了两种不同的思维

  • 面向过程思路:侧重于事件的每一个步骤

    Objective-c:OC语言简介、类与对象_第1张图片

  • 面向对象思想:侧重于达到目标的方式和结果

    Objective-c:OC语言简介、类与对象_第2张图片

工程创建

  • 第1步:开启Xcode,Xcode菜单中选择 File > New > Project,或在Xcode欢迎界面点击“Creat a new Xcode project”。

    Objective-c:OC语言简介、类与对象_第3张图片

  • 第2步:选择工程环境(OS X > Application)与模板(Command Line Tool)。

    Objective-c:OC语言简介、类与对象_第4张图片

  • 第3步:配置工程模板。

    • Product Name:工程名

    • Organization Name:组织机构名称

    • Organization Identifier:标识符

    • Language:开发语言

    Objective-c:OC语言简介、类与对象_第5张图片

  • 第4步:选择存储路径;

解析 Hello world 程序

// 1、导入头文件
#import <Foundation/Foundation.h>

// 2、main函数
int main(int argc, const char * argv[]) {

    // 3、自动释放池
    @autoreleasepool {
        // insert code here...

        // 4、NSLog输出
        NSLog(@"Hello, World!");
    }

    // 5、返回值
    return 0;
}

问答

1、@ 代表什么意思?

  • 作为OC关键字的起始;

  • 使用 %@ 可自动调用 description 方法对该对象进行描述;

  • 在iOS5之后,对部分数据类型的简写,比如:@(1)、@""、@[]、@{} 等;

  • 字符串的开始;

2、NSLog() 什么意思?和printf() 有何区别?

  • NSLog() 为OC输出语句;

  • printf() 函数相比,NSLog()会自动换行,且多了时间戳,相当于打印日志信息;

3、#include#import 有和区别? ""<> 有和区别?

  • #include引入C资源库,#import引入OC资源库;

  • <> 系统存在的,"" 用户自定义的;

类与对象

相关术语

  • 类(class):对一类事物抽象的描述(抽象);

  • 对象(object):从一类事物中具体化出来的一个实例(具体);

    Objective-c:OC语言简介、类与对象_第6张图片

建立类

  • 第1步:工程中选择File > New > File 或 快捷键 command + N;

  • 第2步:选择工程环境(OS X)与模板(Source > Cocoa Class);

    Objective-c:OC语言简介、类与对象_第7张图片

  • 第3步:配置工程模板;

    • Class:类名

    • Subclass of:父类名

    • Language:开发语言

    Objective-c:OC语言简介、类与对象_第8张图片

分析类

1、分析此前创建的类,其文件分为2部分:

  • .h文件为类的声明文件,关键字 @interface 用来表示类的接口。

  • .m文件文件为类的实现文件,关键字 @implementation 用来表示类的实现。

2、接口部分:

@interface Student : NSObject

@end

3、实现部分:

#import "Student.h"

@implementation Student

@end

4、接口和实现都必须使用@end结束,即:@interface @end@implementation @end 成对出现。

5、接口作用:

  • 告诉用户它定义的类在继承树种是如何与别的类链接的,而且对哪些类作了引用;

  • 告诉编译器它所定义的对象应包含哪些实例变量;

  • 告诉用户它有哪些方法可以调用(仅供类实现内部使用的方法不再接口中声明);

NSObject简介

  • OC语言只支持单继承,一个子类只有一个父类,多继承可以使用类别及协议;

  • NSObject是所有类的根类,任意OC的类都源于NSObject;

  • NSObject * 可以简写为id,同时id也可以代表所有对象类型(类似void *泛型指针);

  • 所有子类都可以使用父类的方法,所有对象都能使用NSObject类的方法;

  • 使用%@可以打印任意对象的信息;

  • 对象本质上都是指针,可以直接通过 == 或 != 判定2个对象是否是同一个。

全局变量

  • 在类的声明中添加的,可以在这个类中使用的变量。

  • 某种意义上,类似于结构体的成员变量。

  • 给Person类增加几个全局变量:

@interface Person : NSObject {

    NSString *_name; /**< 姓名 */
    NSString *_code; /**< 身份证 */

    NSInteger _age;  /**< 年龄 */
}
  • 注意上例中,_name 和 _code 的类型都是NSString *, 因为他们需要用OC字符串对象来描述,而_age的类型是NSInteger,不需要*,因为它只需要用数值来描述即可。

创建对象

  • 类的定义完成后,编译器会在内存中自动生成唯一的类对象,实例对象都是通过调用类对象的类方法生成的,类对象是工厂,同时也是蓝图,实例对象是产品。

  • Objective-c创建对象需要两个基本步骤:

    • 内存分配:为新的对象动态分配一段内存地址;

    • 初始化:为这段内存空间中填上合适的初始值;

1、分步初始化
ClassA *a = [ClassA alloc]; // 对象生成和空分配

[a init]; 初始化

// 2、一步到位初始化
ClassA *a = [[ClassA alloc] init];

类方法与实例方法

  • 类方法: + 号方法,即通过类名直接访问的方法;

  • 实例方法: - 号方法,即必须通过类实例化对象后才能访问,不能直接通过类名访问的方法;

  • 在面向对象中习惯上把函数叫做方法。函数是面向过程的产物,方法时面向对象的产物。Objective-C里的方法声明包含以下几个部分:

    • 方法标识+号表示类方法,-号表示实例方法;

    • 方法的返回值;

    • 方法的名称;

    • 方法参数的个数,顺序以及类型;

+|- (返回值)方法名(参数名1:参数类型1, 参数名2:参数类型2...) { 方法体 }

// 示例1:实例化方法
- (id)initWithFrame:(CGRect)frame;

// 示例2:类方法
+ (UIButton *)buttonWithType(UIButtonType)type;

初始化方法

初始化对象成员变量赋默认值

#import "Person.h"

@implementation Person

- (instancetype)init {
    self = [super init];
    if (self) {

        _name = @"Admin";
        _code = @"11021";
        _age  = 22;  
    }
    return self;
}

自定义 init 初始化方法

  • 第1步:接口文件 .h中声明 init 初始化方法
#import <Foundation/Foundation.h>

@interface Person : NSObject {

    NSString *_name; /**< 姓名 */
    NSString *_code; /**< 身份证 */

    NSInteger _age;  /**< 年龄 */
}

- (instancetype)initWithName:(NSString *)name code:(NSString *)code age:(NSInteger)age;
  • 第2步:实现文件.m中实现init初始化方法
#import "Person.h"

@implementation Person

- (instancetype)initWithName:(NSString *)name code:(NSString *)code age:(NSInteger)age {
    if (self = [super init]) {
        _name = name;
        _code = code;
        _age  = age;
    }
    return self;
}
@end
  • 第3步:在 main 函数中 导入 Person.h 文件,并通过自定义 init 初始化方法创建对象
#import <Foundation/Foundation.h>
#import "Person.h"

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        #pragma mark
        #pragma mark - init 初始化对象

        // 创建对象步骤:
        // 1、导入类;
        // 2、分配内存初始化;
        // 3、使用临时变量接收其返回值;

        Person *person = [[Person alloc] init];
        NSLog(@"%@", person);

        #pragma mark
        #pragma mark - 自定义初始化

        Person *person = [[Person alloc] initWithName:@"Petter" code:@"1231111" age:22];
    }
    return 0;
}

遍历构造方法

  • 第1步:在.h文件中声明方法
+ (instancetype)personWithName:(NSString *)name code:(NSString *)code age:(NSInteger)age;
  • 第2步:在.m文件中实现方法
+ (instancetype)personWithName:(NSString *)name code:(NSString *)code age:(NSInteger)age {
    Person *person = [[Person alloc] initWithName:name code:code age:age];
    return person;
}
  • 第3步:在 main 函数中调用遍历构造方法创建对象
Person *person = [Person personWithName:"Admin" code:"1231111" age:23];

你可能感兴趣的:(ios,Objective-C,Class,语言)