黑马程序员技术交流社区

标题: 今天开始整理OC日记了,主要三大特性 [打印本页]

作者: wxy19891017    时间: 2015-4-7 23:20
标题: 今天开始整理OC日记了,主要三大特性
二、        定义OC的类和创建OC对象
1.        类的声明
@interface Car : NSObject
{
                @public
                int speed;//默认初始化为0
                int wheels;
                ……
  }
-        (void) run;//对象方法必须减号- 开头
@end
类名:有意义、驼峰标识、首字母大写
@public可以让成员变量被外界访问
NSObject:继承根类,才能具备创建对象的能力
必须在声明结尾加上@end
2.        类的实现
@implementation Car
-        (void) run
{
        NSLog(@”车子跑起来了”);
}
                   @end//不要忘记
                        类的实现,其实就是对象方法的实现
3.        创建对象
int main()
{
                //定义一个指针变量c指向Car类型对象
                Car *c = [Car new];//Car调用new方法创建对象
                c –>speed = 150;//给Car类型对象成员变量赋值
                c ->wheels = 4;
                [c run];//对象调用run方法
                return 0;
}
4.        注意
成员变量的初始化不能在声明中完成。
对象方法声明必须写在@interface和@end之间,方法实现必须写在@implementation和@end之间;对象方法只能由对象调用。
函数不依赖于对象,函数内部不能直接通过成员变量名访问某个对象成员变量。
三、        方法
1.        不带参数的方法
-        (double) pi;//声明:方法类型 (返回值类型) 方法名;
-        (double) pi
{
        return 3.14;
}
[c pi];//方法调用:[指针变量名 方法名];
2.        带一个参数的方法
-        (int)square:(int)num;//方法名是square:,而不是square
-        (int)square:(int)num
{
        return num*num;
}
[c square:10];//方法调用,需要传入实参值
3.        带多个参数的方法
-        (int)sumOfNum1:(int)num1 andNum2:(int)num2;
//方法名是:sumOfNum1: andNum2: 一定带冒号
-        (int)sumOfNum1:(int)num1 andNum2:(int)num2
{
        return num1+num2;
}
[c sumOfNum1:10 andNum2:20];
四、        封装
封装就是对类中的一些字段,方法进行保护,不被外界所访问到,有一种权限的控制功能。封装的好处:过滤不合理的值,屏蔽内部的赋值过程。
1.        set和get方法
@interface Student : NSObject
{
                  int _age; //成员变量命名:以_开头
                        int _no;//只允许访问,不允许修改,可以只设置get方法
//默认的是private的,但是我们可以使用@public设置为public属性的,那么在外部可以直接访问:stu->age = 20;  
//当然我们一般不这么使用,因为这会破坏封装性
//所以我们需要在外部访问的话,必须定义get/set方法
        - (void)study;
}
@end
1>        set方法
提供一个方法给外界设置成员变量值,可以在方法里面对参数进行相应地过滤。
命名规范:- (void)setAge:(int)age;方法名必须以set开头,后跟上成员变量名,首字母必须大写,返回值一定是void。
2>        get方法
返回对象内部成员变量。
命名规范:- (int)age;返回值类型和成员变量类型一致,不需要接收任何参数,方法名和成员变量名一致。
2.        经典错误
#import <Foundation/Foundation.h>
@interface Person : NSObject
@end

@implementation Person
@end
int main()
{
    Person *p = [Person new];
    // OC是在运行过程中才会检测对象有没有实现相应的方法
    [p test];//实现中没有test方法
    return 0;
}
报错:-[Person test]: unrecognized selector sent to instance 0x7fd2ea4097c0
给Person对象发送了一个不能识别的消息:test
3.        类方法
直接用类名调用方法,不用再创建对象。
以+开头,只能用类名来调用方法,类方法不能访问成员变量。
相比于对象方法,执行效率高,不需要创建对象。当方法内部不需要使用成员变量时,就可以使用类方法。
4.        self关键字
当成员变量和局部变量同名时,采取就近原则,访问的是局部变量。用self访问成员变量,区分同名的局部变量。
注意:1>能用在所有OC方法中,不能出现在函数中
2>self -> 成员变量名 访问当前方法的调用的成员变量
   [self  方法名] 调用对象方法或是类方法
五、        继承
继承是类中的一个重要的特性,他的出现使得我们没必要别写重复的代码,可重用性很高。
继承的使用场合:当两个类拥有相同属性和方法的时候,就可以将相同的东西抽取到一个父类中;当A类完全拥有B类中的部分属性和方法时,可以考虑让B类继承A类。如
@interface Animal : NSObject//基本上所有的类根类是NSObject
{
      double _weight;
}

- (void)setWeight:(double)weight;
- (double)weight;
@end
               
        @interface Dog : Animal//Dog类继承了动物类
{
                double _height;//Dog类完全拥有Animal类的成员变量和方法
}
@end

@implementation Dog
@end
注意:父类声明在子类的前面;子类不能拥有和父类相同的成员变量;调用方法优先去当前类中招,找不到,才去父类中找。
继承和组合:
继承:xxx是xxxx
组合:xxx拥有xxxx
super关键字:
1>        作用:直接调用父类的某个方法
2>        使用场合:子类重写父类方法时想保留父类的一些方法
六、        多态
多态的本质就是父类类型的指针指向子类对象。
Animal *a = [Dog new];
局限性:父类类型变量不能直接调用子类特有的方法,必须强转为子类类型变量后才能直接调用子类特有的方法。如:
Animal *a = [Dog new];
//[a run];run方法为Dog独有,不能直接访问
Dog *d = (Dog *)a;//强制转换为Dog *类型才能调用run方法
[d run];
七、        NSString
最简单创建字符串的方式:
NSString *str = @”jack”;
char *name = “jack”;
创建OC字符串的另一种方式:(实质NSString类调用某个类方法)
NSString *str = [NSString stringWithFormat:@””]

作者: 向大神学习    时间: 2015-4-7 23:24
不错,不错,值得收藏
作者: wxy19891017    时间: 2015-4-8 15:02
向大神学习 发表于 2015-4-7 23:24
不错,不错,值得收藏

非常感谢,一起加油!
作者: 石林林    时间: 2015-4-8 16:08
自己整理的?好厉害
作者: 秋后的梦    时间: 2015-4-8 17:20
哎,到现在还没看的完啊

作者: 蓝鸟    时间: 2015-4-8 19:11
给赞一个




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2