Object-C 类和对象

Object-C 语言的介绍,网上有很多基础教程,这边就不介绍了,可以在网上搜索一下。主要是归纳一下Object-C的知识。


简单说明一下:Object-C简称OC,扩充自C语言,对C语言做了面向对象的处理。

                      是OS X和iOS操作系统的主要编程语言。

                      Swift 是最新的苹果推荐的编程语言,再过几年也许都使用Swift语言开发苹果APP,暂时Swift还不成熟,2.0、3.0、4.0等几个版本还不兼容,如果要看的话,可以看最新的版本4.X,后面会做介绍。

OC语言的特点:

    面向对象:什么是对象,万物皆对象,把事物的共同点抽出来,就是对象,每个具体的事物就是实例(实际的例子)。

    C语言的超集,允许在OC中使用C语言的源代码,编译器兼容C语言程序。

   包含一个运行时系统:RunTime.

    类库丰富

什么是面向对象编程  OOP   Object Oriented Programming

概念:对象、类、封装、继承、多态

类:对某一类对象的统称。比如:花类、鸟类、人类、动物类、汽车类。泛指一大群有相同特质的东西。

对象:对类的具体实例化出来的东西。比如 鸟类中的具体一个对象 鹦鹉,比如自己家养的猫等。就是对类的具体实例化。


面向对象的三大特征: 封装、继承、多态

封装:根据实际情况对类进行属性、方法的包装。对外隐藏信息。把实际的过程在类外面不能开到,只给一个接口给外界。

继承:减少冗余,如果有几个类中有相同的属性或方法,可以通过继承获取到。子类可以继承父类的所有属性和方法。

多态:指程序中定义的引用变量所指向的具体类型和通过该引用变量发出的方法调用在编程时并不确定,而是在程序运行期间才确定,即一个引用变量到期会指向那个类的实例变量,该引用变量发出的方法调用到底是哪个类中实现的方法,必须在由程序运行期间才能确定。(简单一点讲:父类指针指向子类对象,只能调用父类有的方法或者子类重写过的方法,不能调用父类没有的方法)

现在进入主题,以上内容做了解即可。

OC中的类的定义如下: 

 1、接口部分:对外声明类的特征(变量和属性)和行为(方法)

 2、实现部分:对内是想行为(方法)

      1、接口部分:对外声明类的特征(变量和属性)和行为(方法)

//
//  Created by 孙军伟 on 2018/6/3.
//  Copyright © 2018年 孙军伟. All rights reserved.
//

#import <Foundation/Foundation.h>

/**
  接口标识   类名     父类(NSObject 所有类的父类)
@interface Model : NSObject
 注意:成员变量一般用‘_’开始。 和属性的区别
 */
@interface Model : NSObject
{
    // 成员变量及成员变量的可见范围(访问范围)。
    @private // 私有的,只有自己可以访问
    NSString *_name;
    
    @protected // 受保护的,只有自己和自己的子类可以访问
    NSString *_money;
    
    @public  // 共有的,都可以访问
    NSString *_address;
    
    @package // 在这个项目中都可以访问
    NSString *_number;
}

/**
  属性:
 @property : 属性标识符
 nonatomic : 线程不安全的,效率高
 strong    : 强引用
 NSString  : 类型
 name      : 属性名称,小写+驼峰,见名知意,不用‘_’
 */
@property (nonatomic, strong) NSString *name;
/**
 变量和属性的区别:
 引用计数区别:
 变量:直接赋值和 assign 一样,不会导致引用计数增加。
 属性:根据属性修饰符,确定内存引用(strong\retain\assign)。
 
 访问区别:
 属性:可以使用‘.’符号访问相当于 setter,getter方法。self.name
 变量:可以使用指针访问 self->name .也可以使用‘.’访问,需要添加对应的属性和@synthesize name = _name;
 
 注意:以前的LLVM编译器不能根据属性自动生成变量和setter,getter方法。现在的CLang编译器可以更具属性自动生成变量和
 setter\getter方法。
      如果自己输入变量,则系统不会自动生成属性和setter\getter方法,需要使用属性+@synthesize实现。
 */

/**
 方法-声明
 - :表示实例方法
 void : 返回值
 sayHi : 方法名
 */
- (void)sayHi;

// 结束
@end   

      2、实现部分:对内是想行为(方法)  

//  Created by 孙军伟 on 2018/6/3.
//  Copyright © 2018年 孙军伟. All rights reserved.
//

#import "Model.h"

@implementation Model

// 表示系统生成setter\getter方法。可以重新指定变量和属性的对应关系。
@synthesize name = _name;

// 方法实现
- (void)sayHi{
    // 属性和变量的访问方式
    NSString *name = self.name;
    NSString *nameOne = self->_name;
    NSLog(@"Hello World!");
}
@end

会定义类了,那就可以继续往下创建对象

类是模板,对象是具体表现。根据类创建对象分为两步:

第一步:分配内存空间

          根据类中声明的实例变量为对象分配内存空间。

第二步:初始化

          为对象实例变量设置初始值。

例如:

    Person *p = [[Person alloc] init];

    注:alloc 为分配内存空间,init为默认初始化。

    +(id)alloc;  +表示这个方法属于类方法,只能类执行。 id 返回类型,表示任意类型,多态。

    -(id)init;   -表示这个方法属于对象,只能对象执行。 id返回类型,表示初始化完成的对象。可以写,也可以不写,后面会介绍。默认初始化。

    - (id)init{

        _age = 18;

       return self;  //表示我,返回初始化完成的自己

   }

   = 先执行右边,在赋值给左边。*p指指针,指向生成的对象的首地址。

那对象初始化了,实例变量怎样调用呢?

可以使用指针的方式调用:

p->name = @"张三"; // 设置名字和年龄

p->age = 18;

NSLog(@"年龄:%d",p->age);  // 调用设置的年龄

介绍一下变量和属性的修饰符:就是可以在什么地方访问属性。

public : 公有的,实例变量可以在类的外部和内部操作。  一般不使用,不符合面向对象三大特征之一的封装特性。

protected :受保护的,实例变量只能在类和子类的内部操作。  默认的

private :私有的,实例变量只能在该类内访问。(只能在  @implementation  @end 中使用)

如何在其他类里面方位 protected,和private的变量。提示:可以定义两个方法,一个赋值,一个取值方法即可。


介绍一下,+方法  ,和 -方法。

+ 方法称为:类方法,只能类调用。

- 方法称为:实例方法,只能实例使用。

方法定义:

方法类型  返回值类型 参数形容词:(参数类型)参数名 

-(void)sayHi:(NSString *)hi withObject:(id)anObject;

方法名:sayHi: withObject:   (:不能省略,有冒号必有参数)

赋值、取值方法。

- (void)setName:(NSString *)name;  //赋值方法

- (NSString *)name; //取值方法

方法的使用:[person sayHi];   person 发送消息 sayHi,

OC中不能叫调用发放,应该叫 消息发送。 【receiver message】.

正确的表述为:给person对象发送 sayHi方法。

为实例变量赋值的方法叫 设置器 ,取值的方法叫 访问器

setter 格式为:- (void)setAge:(int)age; set+首字母大写  设置器

getter 格式为: - (void)age;  //都要忽略下划线。


自定义初始化:

- (id)initWithName:(NSString *)name sex:(NSString *)sex;

- (id)initWithName:(NSString *)name sex:(NSString *)sex{

     _name = name;

     _age = age;

     return self;

 }


导入文件,分导入系统文件和导入自定义类。功能和C语言的 #include 功能一样。但是可以避免重复导入。

#import <系统文件>

#import "自定义文件"

@class A  告诉编译器 @class后面的字符串作为类名使用,并未导入类的接口内容。避免循环导入。

猜你喜欢

转载自blog.csdn.net/zhongnanshan_001/article/details/80209569