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];
}