OC学习笔记 - OC基础1

本章知识点:Foundation.h,import和include,printf与NSLog的区别,函数与方法,如何编写类的声明和实现,创建对象并给对象发送消息,类方法,全局变量&局部变量&成员变量,常见错误

Foundation.h

  1. 我们称之为主头文件, 主头文件中又拷贝了该工具箱中所有工具的头文件, 我们只需要导入主头文件就可以使用该工具箱中所有的工具, 避免了每次使用都要导入一个对应的头文件
  2. 工具箱的地址: /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/System/Library/Frameworks
  3. 规律:
    所有的主头文件的名称都和工具箱的名称一致
    所有的主头文件都是导入了该工具箱中所有工具的头文件

import与include

  1. import的功能和include一样, 是将右边的文件拷贝到当前import的位置
    为了降低程序员的负担, 防止重复导入, 避免程序员去书写头文件卫士, OC给出来一个新的预处理指令import
  2. import优点: 会自动防止重复拷贝
  3. 因为OC完全兼容C, 所以可以在OC程序中编写C语言代码
    并且可以将C语言的源文件和OC的源文件组合在一起生成可执行文件

printf和NSLog的区别

  1. NSLog会自动换行
  2. NSLog在输出内容时会附加一些系统信息
  3. NSLog和printf接收的参数不一样

函数与方法

//C语言函数
void about(); //声明
void about()  //实现
{
    printf("model = cpu = size = color");
}

//OC方法
- (void)about;           //声明
@implementation Iphone   //实现
- (void)about
{
     NSLog(@"打印本机信息");
}
   @end
  1. C语言中函数分为声明和实现
    OC中定义一个类也分为声明和实现, 也就是说以后我们在OC中定义类, 就是在写类的声明和实现
  2. OC中的行为和C语言中的函数一样, 都是用来保存一段特定功能的代码
    C语言中定义一个函数, 分为声明和实现, 声明写在.h中, 实现写在.c中
    OC中定义一个方法, 也分为声明和实现, 声明写在@interface中, 实现写在@implementation
  3. C语言的函数分为两种: 内部函数和外部函数
    OC中的方法也分为两种; 类方法和对象方法
  4. 类方法只能用类名调用, 对象方法只能用对象调用
    OC中的类方法用+表示, OC中的对象方法用-表示
  5. 编写C语言函数的规律: 1.确定函数名称 2.确定形参 3.确定返回值 4.确定返回值类型
    编写OC方法也有规律, 规律和C语言一模一样
  6. 注意: OC中的方法, 如果没有形参不需要写(), 而是直接写一个;
    为什么OC中没有形参不需要写()呢?
    因为OC方法中的()有特殊的用途, OC方法中的()是用来扩住数据类型的
  7. 方法和函数的声明
    C语言函数:
    int signal(int number);
    OC语言方法:
    - (int)signal:(int)number;
    注意: OC中的方法如果有参数, 那么每个参数的数据类型前面必须加上一个:
    注意: 当前这个有参数的方法它的方法名称是 signal:
    冒号也是方法名称的一部分
    有返回值并且有多个参数的:
    C语言函数:
    int sendMessage(int number, char *content);
    OC语言方法:
    (int)sendMessage:(int)number :(char *)content;
    注意: 上面这个方法的方法名称是sendMessage::
  8. 1 函数属于整个文件, 方法属于某一个类
    方法如果离开类就不行
    2 函数可以直接调用, 方法必须用对象或者类来调用
    注意: 虽然函数属于整个文件, 但是如果把函数写在类的声明中会不识别
    3 不能把函数当做方法来调用, 也不能把方法当做函数来调用
  9. 方法的注意点:
    1 方法可以没有声明只有实现
    2 方法可以只有声明没有实现, 编译不会报错, 但是运行会报错
    3 如果方法只有声明没有实现, 那么运行时会报:
    reason: '+[Person demo]: unrecognized selector sent to class 0x100001140'
    //发送了一个不能识别的消息, 在Person类中没有+开头的demo方法
    reason: '-[Person test]: unrecognized selector sent to instance 0x100400000'

如何编写类的声明和实现

类的声明:

@interface Iphone : NSObject
{
    @public
     float _model; 
     int _cpu; 
     double _size; 
     int _color; 
}
- (void)about;
@end

类的实现:

@implementation Iphone
- (void)about
{
    //如果在对象方法中想访问该对象的属性, 可以直接写上_属性名称即可
     NSLog(@"型号 = %f, cpu = %i, 尺寸= %f, 颜色 = %i", _model, _cpu, _size, _color);
}
  1. 声明以@interface开头 , 以@end结尾, 然后再class name对应的地方写上 事物名称, 也就是类名即可
    注意: 类名的首字符必须大写
  2. 声明一个类的目的就是为了告诉系统, 我们这个类中有哪些属性和行为
    OC类声明中属性只能在写@interface和@end之间的{}中
    注意: 编写OC类属性的时, 建议将所有属性的名称前面都加上_
  3. 类名后面的 :NSObject 是为了让类具备创建对象的能力
    注意:
    默认情况下, OC对象中的属性是不能直接访问的
    只要让类中的属性公开, 以后就可以直接通过一个指向结构体的指针来操作对象中的属性
  4. 类可以只有实现没有声明
    注意: 在开发中不建议这样写

创建对象,给对象发送消息

//每次给IPhone类发送一个new消息都会开辟一块新的存储空间
//也就意味着每次发送new消息创建出来的对象都是一个新的对象
IPhone *p = [IPhone new];    
//给对象发送消息
[p about];
  1. 通过类创建对象
    1 开辟存储空间, 通过new方法创建对象会在堆 内存中开辟一块存储空间
    2 初始化所有属性
    3 返回指针地址
  2. 创建对象的时候返回的地址其实就是类的第0个属性的地址
    但是需要注意的是: 类的第0个属性并不是我们编写的_age, 而是一个叫做isa的属性
    isa是一个指针, 占8个字节
  3. 其实类也是一个对象, 也就意味着Person也是一个对象
    平时我们所说的创建对象其实就是通过一个类对象来创建一个新的对象
    类对象是系统自动帮我们创建的, 里面保存了当前对象的所有方法
    而实例对象是程序自己手动通过new来创建的, 而实例对象中有一个isa指针就指向了创建它的那个类对象

类方法

//只需要将对象方法的-号换成+, 那么就定义了一个类方法
+ (int)sumWithValue:(int)value1 andValue2:(int)value2;  //声明
   
+ (int)sumWithValue:(int)value1 andValue2:(int)value2   //实现
{
     return value1 + value2;
}
  1. 类方法和对象方法的区别
    1. 对象方法以-开头
      类方法以+开头
    2. 对象方法必须用对象调用
      类方法必须用类来调用
    3. 对象方法中可以直接访问属性(成员变量)
      类方法中不可以直接访问属性(成员变量)
    4. 类方法和对象方法可以进行相互调用
      1. 对象方法中可以直接调用类方法
      2. 类方法中间接调用对象方法 (注意: 不建议这样使用)
      3. 类方法中可以直接调用其它类方法
      4. 对象方法中可以直接调用对象方法
  2. 类方法的应用场景
    如果方法中没有使用到属性(成员变量), 那么能用类方法就用类方法
    类方法的执行效率比对象方法高
    类方法一般用于定义工具方法,比如字符串查找,文件操作,数据库操作

全局变量,局部变量,成员变量

@interface Person : NSObject
{
     int age;         //成员变量
}
@end    

@implementation Person

@end
int a;              //全局变量    
int b = 10;         //全局变量    
int main(int argc, const char * argv[]) {
int num = 10;   //局部变量
{
     int value;  //局部变量
}
     return 0;
}
  1. 写在函数和大括号外部的变量, 我们称之为全局变量
    作用域: 从定义的那一行开始, 一直到文件末尾
    局部变量可以先定义在初始化, 也可以定义的同时初始化
    存储: 静态区
    程序一启动就会分配存储空间, 直到程序结束才会释放
  2. 写在函数或者代码块中的变量, 我们称之为局部变量
    作用域: 从定义的那一行开始, 一直到遇到大括号或者return
    局部变量可以先定义再初始化, 也可以定义的同时初始化
    存储: 栈
    存储在栈中的数据有一个特点, 系统会自动给我们释放
  3. 写在类声明的大括号中的变量, 我们称之为成员变量(属性, 实例变量)
    成员变量只能通过对象来访问
    注意: 成员变量不能离开类, 离开类之后就不是成员变量, 成员变量不能在定义的同时进行初始化
    存储: 堆(当前对象对应的堆的存储空间中)
    存储在堆中的数据, 不会被自动释放, 只能程序员手动释放

常见错误

  1. 只有类的声明,没有类的实现
  2. 漏了@end
  3. @interface和@implementation嵌套
  4. 成员变量没有写在括号里面
  5. 方法的声明写在了大括号里面
  6. 成员变量不能在{}中进行初始化、不能被直接拿出去访问
  7. 方法不能当做函数一样调用
  8. OC方法只能声明在@interface和@end之间,只能实现在@implementation和@end之间。也就是说OC方法不能独立于类存在
  9. C函数不属于类,跟类没有联系,C函数只归定义函数的文件所有
  10. C函数不能访问OC对象的成员
  11. 低级错误:方法有声明,但是实现的时候写成了函数
  12. OC可以没有@interface同样可以定义一个类

你可能感兴趣的:(OC学习笔记 - OC基础1)