OC基础——函数和对象、类

进行的值传递,函数内部不能改变函数外面的值
void test(int _w,int _s){
    _w = 3;
    _s = 200;
}
//可以把oc中的类理解成数据类型,所以可以做参数
//进行的是地址传递 函数内部可以改变函数外面的值
void test1(Car * _car){
    _car->_speed = 400;
    _car->_wheel =1;
}
//进行的是地址传递   函数内部不一定改变函数外面的值
void test2(Car *_car){
    Car *car1 = [Car new];
    
    car1->_wheel = 0;
    car1->_speed = 700;
    
    _car = car1;
    
    _car->_speed = 20;
    _car->_wheel = 9;

}//空对象调用方法不会报错,但是无法实现调用

创建类注意点

常犯的错误
     1.只写声明
     2.丢掉@end
     3.声明与实现不能发生嵌套
     4.类的声明与实现部分不能写在函数中
     5.不能在类的声明中直接给成员变量赋值
     6.成员变量只能写在大括号里面
     7.方法的声明不能写在大括号里面
     8.声明类时,类名后面的冒号与NSObject不能省略
     9.当方法只写声明不写实现的时候,调用这个方法会出错
     //当对象找要调用的方法出问题的时候(找不到这个方法的时候)     -[Person run]: unrecognized selector sent to instance 0x100202ef0
     10.方法的声明不写只写实现

NSString-oc中的字符串类

    NSString *str = @"好学生";
    //c当中的打印函数不能打印oc中的字符串对象
    //打印oc中的对象的格式符是%@
    //printf("%@",str);
    
    //通过stringWithFormat:这个方法得到一个格式化的新字符串
    NSString *str1 = [NSString stringWithFormat:@"体重是%i,身高是%i",weight,height];
    //c当中的strlen函数在输出长度的时候,是以字节为单位输出
    unsigned long cL = strlen(c);
    //oc当中的length方法在输出长度时,是字符为单位。各个国家的字符都可以识别
    NSUInteger ocL = [str length];

对象、值传递总结

     1.当结构体作为对象的成员变量的时候,不能进行整体的赋值,因为结构体只能在初始化的时候进行整体赋值。
     2.对象可以作为参数传递。例子:人开钱射击
     3.同一个对象作为参数可以在不同方法之间传递,(击鼓传花)
     4.对象作为参数的连续传递:人开枪  枪射击子弹 (子弹作为参数连续传递)
     5.对多文件的实现。最好是一个类对应一个.h和。m文件

类方法

    对象方法只能由对象调用, 类方法只能由类名调用

    类方法好处:

        1.节省内存,(调用类方法的时候,不用创建对象)
        2.提高了效率(直接找到方法列表,而不是像调用对象方法一样,经过两层指向)
           当对象方法找不到的时候报的错误  -[Calculator subWithNumber1:andNumber2:]: unrecognized selector sent to instance 0x100107df0
           当类方法找不到的时候报的错误   +[Calculator subWithNumber1:andNumber2:]: unrecognized selector sent to class 0x1000011d8

       3.除方法中使用成员变量这个情况,在使用方法的时候都尽量使用类方法
       4.可以作为工具方法

     对象方法与类方法的区别

     对象方法:
     以-开头
     内部可以使用成员变量
     只能用对象调用对象方法
     对象方法可以代用类方法,也可以调用对象方法
     
     类方法:
     以+开头
     内部不可以使用成员变量
     只能用类名调用类方法
     类方法可以调用类方法(自己除外)

     系统通过方法前面的+-号来区分对象方法或类方法

注意:

     类方法调用类方法           可以
     类方法调用对象方法       不可以
     对象方法调用类方法       可以
     对象方法调用对象方法   可以

匿名对象

     定义:不用创建一个指针保存对象地址,这种对象就叫做匿名对象;需要创建一个指针来保存对象的地址,叫实名对象    

      [Phone new];//匿名对象
       1.如果某个方法调用的次数很少,甚至一次。就使用匿名对象进行调用,可以简化代码
       2.匿名对象还可以作为参数传递     
    [person callPhone:[Phone new]];

     用处:当需要调用的方法只需要调用一次,用匿名对象,节省了代码
                当需要作为参数传递的时候

get、set方法

set方法   相当于写数据

 1.必须是对象方法,必须用对象去调用
 2.要以-开头
 3.返回值必须是空
 4.方法名以set开头,剩下的部分就是成员变量去掉下划线后的部分,剩下部分的首字母大写。
 5.必须有参数,且参数的类型与成员变量相同,参数的名称就是成员变量去掉下划线后的部分
 -(void)setName:(NSString *)name;

 get方法  相当于读数据

    1.必须是对象方法,以-开头
    2.必须有返回值,返回值的类型就是成员变量的类型
    3.不要参数
    4.方法名:成员变量去掉下划线后的部分

 -(void)name;

 self

     self使用:谁调用这个方法,self就代表谁
     类调用类方法,self就代表类名
     对象调用对象方法,self就代表对象
     
     注意:self在调用成员变量的时候,肯定代表的时对象
     在有成员变量与局部变量同名的时候,如果想调用成员变量就可以使用->去通过self获取成员变量
      +[Phone cameraWithFlashLightStatus:]: unrecognized selector sent to class 0x1000011f8  出现这个错误是因为没有找到这个类方法
      不管是对象方法调用对象方法,还是类方法调用类方法,都是自己调用自己,都会造成死循环
        -(void)test{
            [self test];
        }

 

你可能感兴趣的:(Objective-C)