一、类和对象

1.接口部分:对外声明类的行为和特征(类的定义分为:接口部分和实现部分)
① @interface 接口关键字:用于表示这是一个类的接口部分
     接口部分功能:是定义类的静态特征和声明动态行为
     @end 作为结束标志
     
     对外接口:通过接口就可以在不知道实现的情况下,了解这个类有什么
 
     Person:类名,每一个类都要起一个名字。首字母大写(类:对象的类型)
     NSObject:父类
@interface Person: NSObject
②静态特征:实例变量
③实例变量必须在花括号中
④创建实例变量的时候不能被赋值
⑤在创建实例变量的时候,实例变量钱加“_”:系统这样写;区分;
{
     ⑤实例变量的可见度
     《1》内部:类的实现部分使用实例变量
     《2》外部:不在实现部分使用
     《3》@public范围:外部、内部、继承
     《4》@protected(系统默认)范围:内部、继承
     《5》@private范围:内部
     //添加当前类属性
     @public//作用范围是直到下一个结束或者实例变量结束
     NSString *_name;
     NSInteger _age;
 
     @protected
     CGFloat _height;
 
     @private
     CGFloat _weight;
}
 
//动态行为:方法(添加类的行为)
- (void)sayHi;
 
@end
2.实现部分:类行为的具体实现(方法的实现)
①@implementation:关键字,表示类的实现部分
     Person:类名,表示实现的是哪个类
     @end:类 结束实现标志
@implementation Person
 
- (void)sayHi{
     NSLog(@“Hello World”);
}
 
@end
3.使用类创建对象。Objective-C中创建的对象,全部放在堆区(对象:类的实例)
int main(){
     @autoreleasepool{
          ①申请空间
          保存空间地址
          《1》内存分配 (alloc方法:用于分配内存空间)
          Person *p = [Person alloc];
          《2》对象初始化(init方法:用于初始化对象),将内存空间数据清零
          p = [p init];
 
          《3》将创建对象的《1》和《2》合成一步
          Person *p1 = [[Person alloc] init];
 
          ②使用成员变量
          p1->_age = 10;
          p1->_name = @“贝爷”;
 
          ③使用方法
          [p1 sayHi];
     }
     return 0;
}
4.类是对一类具有相同事物行为和特征事物的抽象
5.封装、继承、多态
①封装:将现实世界中存在的某个客体的属性与行为绑定在一起,并放置在一个逻辑单元内
②继承:子类自动共享父类数据结构和方法的机制,这是类之间的一种关系
③多态:指相同的操作或函数、过程可作用于多种类型的对象上并获得不同的结果
6.@class的作用:只是表示有Girl这么一个类型,其他的什么都没做。在什么地方使用Girl这个类时,再导入Girl.h
注意:我们一般选择在.h中使用@class,在.m中引入头文件
7.组合类的使用:(指针存储对象的首地址,代指对象。OC中使用指针代指对象,进行操作)
①Mother.h
#import <Foundation/Foundation.h>

@interface Mother : NSObject
{
    @public
    NSString *_name;
}
@end
②Father.h
#import <Foundation/Foundation.h>

@interface Father : NSObject
{
    @public
    NSString *_name;
}

@end
③Child.h
#import <Foundation/Foundation.h>

@interface Child : NSObject
{
    @public
    NSString *_name;
}
@end
④Family.h
#import <Foundation/Foundation.h>
#class Father;
#class Mother;
#class Child;

@interface Family : NSObject
{
@public
    Father *_f;
    Mother *_m;
    Child  *_c;
}

@end
⑤main.m
        Father *father = [[Father alloc]init];
        father->_name = @"父亲";
        Mother *mother = [[Mother alloc] init];
        mother->_name = @"母亲";
        Child *child = [[Child alloc] init];
        child->_name = @"孩子";
        Family *family = [[Family alloc] init];
        family->_f = father;
        family->_m = mother;
        family->_c = child;
        NSLog(@"%@ %@ %@ ",family->_f->_name,family->_m->_name,family->_c->_name);
8.打印字符串用“%@”做占位符。用”[]”调用方法
有打印,没有控制台输入
9.
①面向过程:编程以事件(任务)为中心,程序围绕事件,列出了事件的每个步骤,一步一步完成(侧重点:实现功能 C)
②面向对象:编程以事物为中心,程序围绕事物展开,完成事件只是一个小任务(侧重点:对象的特征 OC,C++,java)
10.Objective-C中的几种方法
①“-”实例方法:由类的实例来执行。换言之,在调用实例方法之前,必须先创建该类的实例。实例方法是最常见的方法类型(方法只能对象使用)
示例:- (instancetype)init;
// 有参(1个参)无返回值
// 冒号属于方法名的一部分
// 方法名:printNum:
- (void)printNum:(NSInteger)num;
// 有两个参数
// 方法名:printName:age:
- (void)printName:(NSString *)name age:(NSInteger)age;

//有三个参数
//方法名:printName:age:score:
- (void)printName:(NSString *)name age:(NSInteger)age score:(CGFloat)score;
②“+”类方法:可由它所在的类直接执行。它不需要对象的实例作为消息的接收者(方法只能被类使用)
示例:+ (instancetype)alloc;
注:类方法中不能使用实例变量
11.instancetype和id区别
①instancetype可以返回和方法所在类相同类型的对象,id只能返回未知类型对象。
②instancetype只能作为返回值和参数,id还可以用来定义变量
③instancetype会告诉编译器当前的类型,但id对编译器却是无类型的,调用任何方法不会给出错误提示
④对于init方法,id和instancetype是没有区别的。因为编译器会把id优化成instancetype。当明确返回的类型就是当前class时,使用instancetype能避免id带来的编译不出错误的情况。
12.如何获取方法名
①删除:类型标识,返回类型,参数类型,参数名,空格。
示例:replaceObjectAtIndex:withObject
注意:类中不能出现同名方法;“:”标识参数,不能省略。有冒号必须有参数;冒号属于方法名的一部分。
13.在OC中使用消息发送机制:[receiver message]
表述:①给receiver对象发送message消息②receiver接收到消息,即方法getSalary③receiver找到message方法,并执行
14.setter和getter方法
①在OC中,为单一实例变量赋值的方法称作setter(设置器)
②获取单一实例变量值得方法称作getter(访问器)
15.setter和getter方法的书写格式
给实例变量:NSInteger _age;
①setter的书写格式:- (void)setAge:(NSInteger)age;
即set+首字母大写的实例变量名(忽略下划线)
②getter的书写格式:- (NSInteger)age;
j即返回值类型与变量类型一致,方法名与实例变量名相同(忽略下划线)
16.setter和getter与实例变量的关系
①无论setter还是getter内部操作的是实例变量
②每一个实例变量都需要一对setter和getter方法
17.setter和getter的实际操作
①Person.h
#import <Foundation/Foundation.h>

//类的接口部分
/*
 1.定义一个类
 2.添加当前类属性(特征)
 3.添加当前类行为(方法)
 */
@interface Person : NSObject
{
    //大括号内部,添加当前类属性
    //字符串类型
    NSString *name;//姓名,NSString同样是一个类
    //整型
    NSInteger age;//年龄,NSInteger是数值类型,不是一种类
    //字符串类型
    NSString *gender;//性别
}
//初始化方法
//希望通过初始化方法,能够获得一个Person类的实例对象,并且希望该对象具有自己的姓名属性
- (id)initWithName:(NSString *)_name;

//大括号外部,添加当前类行为
- (void)sayHi;

//设置器 setter
- (void)setName:(NSString *)_name;
- (void)setAge:(NSInteger)_age;
- (void)setGender:(NSString *)_gender;

//访问器 getter
- (NSString *)getName;
- (NSInteger)getAge;
- (NSString *)getGender;

@end
②Person.m
#import "Person.h"

@implementation Person

- (id)initWithName:(NSString *)_name{

    //1.原始初始化,也就是将内存内的变量置零
    self = [super init];//init方法发送给super对象
    //2.原始初始化成功之后,需要设置当前对象的姓名为形参
    if (self != nil) {
        name = _name;
    }
    //3.返回当前对象
    return self;
}

//大括号外部,添加当前类行为
- (void)sayHi{
   
    //NSLog将字符串打印在控制台进行输出,类似于printf();
    NSLog(@"hello world");
}

//设置器 setter
- (void)setName:(NSString *)_name{
    //设置给当前对象的属性
    name = _name;
}
- (void)setAge:(NSInteger)_age{
    age = _age;
}
- (void)setGender:(NSString *)_gender{
    gender = _gender;
}

//访问器 getter
- (NSString *)getName{
    //访问当前对象的属性
    return name;
}
- (NSInteger)getAge{
    return age;
}
- (NSString *)getGender{
    return gender;
}
@end
③main.m
#import <Foundation/Foundation.h>
#import "Person.h"//引入类名字
int main(int argc, const char * argv[]) {
    //1.创建Person类的实例对象
    Person *person = [[Person alloc] initWithName:@"Lewis"];//用【】调用方法
    //2.person发送实例消息sayHi
    [person sayHi];
   
    //修改name,添加设置器(setter)与访问器(getter
    /*
     类名    属性名  设置器方法名 访问器方法名
     Person  name  -setName:   -getName
     */
   
    //3.先打印当前person实例对象的姓名是什么
    NSLog(@"person's name is %@",[person getName]);
   
    //4.修改当前person实例对象的姓名,修改成jack
    [person setName:@"Jack"];
    NSLog(@"person's name is %@",[person getName]);
   
}
18.点语法(只对getter setter有效)
s.name = @"小白";
NSLog(@"%@",s.name);
       
[s setAge:12];
NSLog(@"%ld",[s age]);
s.score = 99.99;
NSLog(@"%.2f",s.score);
原文地址:https://www.cnblogs.com/gnhxsk/p/5168152.html