1,同类型的指针变量之间是可以互相赋值的 Person *p1 = [Person new]; Person *p2 = p1;
代表将p1的值赋值给了p2 而p1的值是对象的地址 所以就把对象的地址赋值给了p2 所以p1和p2指向了同一个对象 无论通过p1还是p2区修改对象,修改的都是同一个对象
2,目前为止,只要看到了new 就说明新建了一个对象
1,分组导航标记
main。h后面有一个导航
1),#pragma mark 分组名
就会在导航条对应的位置显示一个标题
2),#pragma mark -
就会在导航条对应的位置显示一条水平分割线
3),#pragma mark -分组名
就会在导航条对应的位置显示一条水平分割线,在显示
1,我们之前在C中学习的函数,就叫做函数
void test(){};
2,在OC类中写的方法,就叫做方法
- (void)sayHi;
3,相同点
都是用来封装一段代码的,将一段代码封装在其中,表示一个相对独立的功能 函数和方法只要被调用,那么封装在其中的代码就会被自动执行
4,不同点
1),语法不同 函数语法: 返回值类型 函数名(参数列表); 方法语法: - (返回值类型)函数名 :(参数类型)参数名。。。。。。
2),位置不同 OC方法的声明只能写在@interface的大括弧外面,实现只能写在@implementation之中 函数除了函数内部 和 @interface的大括弧之中 其他的地方都是可以写的 就算吧函数写在类中,这个函数仍然不属于类 所以创建的类的对象中也没有这个函数 注意:函数不要写到类中去 虽然这样是可以的 但是这么做是极度地不规范
3),调用方式不一样 函数可以直接调用 方法必须要先创建对象 通过对象来调用
4),方法有个家 是类 ,函数是没有家的 方法是属于类的 ,而函数是独立的
1,最容易犯错
1),@interface时类的声明 @implementation是类的实现,是不能相互嵌套的。
2),类必要先声明,然后才能去实现。
3),类必须要声明和实现都有,即使是没有方法的类 也需要有实现。
4),类的声明必须要放在类的前面 类的实现可以放在类的后面
5),声明类的时候,类的声明和实现必须要同时存在, 特殊情况下,可以只有实现,没有声明 但是很不建议你这么做 不规范
6),属性名一定要以下划线来开头。 这是规范。 类名 但一个单词的首字母大写
7),属性不允许声明的时候初始化。
8),OC方法必须要创建对象通过对象名调用
9),方法必须既有声明,也要有实现 a,如果方法只有声明,没有实现 编译器会给警告 不会报错 b,如果指针指向的对象有方法的声明而没有方法的实现, 那么通过指针来调用这个这个方法在运行的时候,就会报错。
unrecognized selestor send to instance )0x100420510
说明要么对象中没有这个方法,要么有这个方法的声明,但是没有实现。
1,目前为止,所有的类都是写在main。m中
后果:难以维护,也不利于团队开发。
2,推荐的方式
把一个类写在一个模块中,而一个模块至少包含两个文件 。h文件 写类的声明 要引入Foundation 框架的头文件 。m文件 写类的实现 要引入这个模块的头文件 建议一个类独占一个模块
如果要用到类 引入这个类模块的头文件就可以了
3,添加另一个模块的更简捷的方式 新建一个文件 选择Cocoa class 决定类的名称不是文件的名称 而是代码 但是建议文件名和类名相同
4,当我们要使用这个类的时候 需要先将这个类的头文件引进来 才可以使用
1,对象和方法
对象作为方法的参数 对象作为方法的返回值
2,类的本质是我们自定义的数据类型 因为对象在内存中的大小是由我们决定的
什么是数据类型:是在内存中开辟空间的一个模版
3,既然类是一个数据类型,那么类就可以作为方法的参数 - (void)testWith :(Dog*)dog;
4,语法注意
1),当对象作为方法的参数的时候,参数应该怎么写 参数类型是类指针 :(Dog*)dog
2),调用方法的时候,如果参数是一个对象 那么给实参的时候,实参要求也必须是一个符合要求的对象。 如果传入的对象不符合要求 就会出问题
3),当对象作为方法的参数传递的时候 是地址传递 所以在方法内部 ,通过形参修改形参指向的对象的时候 会影响实参变量指向的对象的值。
--------------------------------
1,对象也可以作为方法的返回值
1),什么时候方法的返回值是一个对象呢 当方法执行完毕的时候,如果有一个对象方法的内部不知道如何处理 并且这个对象是调用者需要的 这个时候我们就应该将这个对象返回
2),如果方法的返回值是一个对象 返回值类型应该写一个类指针
|