OC面向对象之---类、对象和方法

时间:2022-12-10 14:56:16


OC面向对象之—类、对象和方法


1.Objective-C语言概述

2.面向对象思想

3.掌握类和对象的特征

4.类、方法的定义

5.创建对象,方法调用

Objective-C是面向对像的语言,它是在C语言的基础上封装出来的,C语言是面向过程的语言。面向过程和面向对象是解决问题的两种思想。接下来会讲到,其实重在理解,真要是以后敲代码敲多了也就慢慢知道了什么是面向对象的思想。有种爱你在心口难开的感觉就行。


Objective-C语言呢相对于C更简单更符合人的思维逻辑,人们考虑要对某些事物做操作的时候,是不是先考虑操作对象是什么啊首先得有个操作对象吧,然后考虑需要操作对象干什么,我们首先得明确这个操作对象有啥特征吧,还得知道操作对象能干啥吧。OC代码的编写类似这种逻辑,这就是面向对象的思想。


在OC语言里,什么是类?什么是对象?


什么叫做方法?怎么创建类、对象和方法?带着疑问才能更快的融入OC的学习。


OC语言概述:

Objective-C(简称OC)是iOS开发的核心语言

OC是在C语言的基础上,对C语言进行了封装,增加了面向对象特性

iOS开发也兼容C语言、C++混编

OC语言的近状:

OC既有着良好的发展前途,又有着不错的收入,在编程语言位居前三甲。其实编程语言都是相通的,你只要掌握了其中的一门语言,想自学其他语言很简单,毕竟不能只抱着一门语言肯到死,时代在发展科技在进步,万一又出来个更简单流行的语言是不是就要慢慢废弃一些语言了。是吧,希望大家不要仅限于此,把目标放的长远一些。OC和Swift想通,掌握了OC完全可以自学Swift,公司的竞争也是很大的,如果你只想安静的做个程序员,那就没法交流了。想往上走的话你的知识和见识都得往上走才能升职加薪,赢取白富美。


开始第一个程序:

学习任何程序语言第一个程序都是从Hello World开始:OC也不例外

代码展示。。。


int main(int argc, const char * argv[]) {

    @autoreleasepool {        

        //OC语言的输出语句 NSLog(@"");括号里面的形式很重要@""表示要输出的内容。

        

        //打印形式一

        NSLog(@"Hello, World!\n");

        NSLog(@"\n=========分割线============\n");

        NSLog(@"\n=========割了才会火=========\n");

  

        //打印方式二

        //C语言打印函数(OC支持混编)

        printf("Hello, World!\n");

      

        //奇怪的打印方式三

        //foundation框架里会讲

//        NSString*str = @"奇怪的世界\n";

//        NSLog(str,nil);

        //打印参数内容

        int i = 110;//整形数

        printf("C整形数i是%d\n",i);

        NSLog(@"OC输出整形数i是%d\n",i);//输出内容比C多了个@标识符,一定不能少

        //%d替换符号,自己定位

//        NSString*str1 = @"OC输出整形数i是%d\n";

//        NSLog(str1,i);   

    }

    return 0;

}

C过渡到OC


关键字:


和C语言32(杨坤特喜欢这个数字)个关键字一样,C语言的关键字不能做变量名,这里OC也有很多关键字不能作为实例变量名(接下来在讲类的时候会讲到什么是实例变量)在这里大家作为了解就可以,在以后的学习中我们都会接触到,这些关键字都有标识符@引导的

字符串:

       字符串都是以@开头的,比如@"Hello"是OC中的字符串

控制打印:

      C语言中使用printf("Hello")打印字符串, OC中使用NSLog函数打印字符串



暂时知道这些就可以了,就这么简单就过度过来了。。。以后写代码就会慢慢熟悉起来,熟能生巧嘛。


Xcode快捷方式:

command + shift + N      新建项目

command + N          新建文件

command + delete删除一行

command + /      注释

command + ] 或者 [   前后退格

command + option + ] 或者 [  代码上下移动

command + control + 上下方向键  .h  .m文件切换

command + control + 左右方向键  后退和前进

command + R 运行

command + B  编译

command + shift + k  clean缓存

command + option + 0  隐藏或显示右侧工具栏

shift + 上下方向键   选中代码

command + ,        打开偏好设置



OC程序的运行步骤:

编写程序(C语言的源文件是.c后缀,OC的源文件的后缀.m)

链接(常出错的两步)

编译(常出错的两步)Command+B生成.o文件(编译后的路径/Users/mac/Library/Developer/Xcode/DerivedData/Hello-Demo-alhfdopskmxltmgalbsleztjjffz/Build/Intermediates/Hello-Demo.build/Debug/Hello-Demo.build/Objects-normal/x86_64)

执行Command+R


C语言也是类似的步骤只不过我们用的是终端,这里用的是Xcode

看一下OC常用的类型:

//定义枚举

typedef enum {

    sunny = 0,

    windy = 1,

    raining = 2

}weather;


int main(int argc, const char * argv[]) {

    //整型

    NSInteger a = 10086;//按着Command单击,代码演示

    NSLog(@"a = %ld",a);//这里是long型ld输出否则有警告

    /**

     * 这是对NSInteger的定义,对于不同平台32、64位有不同的最大值,可以直接转化

     #if __LP64__ || (TARGET_OS_EMBEDDED && !TARGET_OS_IPHONE) || TARGET_OS_WIN32 || NS_BUILD_32_LIKE_64

     typedef long NSInteger;

     typedef unsigned long NSUInteger;

     #else

     typedef int NSInteger;

     typedef unsigned int NSUInteger;

     #endif

     */

    //布尔类型

    BOOL b = YES;//同C语言

    BOOL c = true;

    NSLog(@" b = %d, c = %d",b,c);

    //三目运算符

    b == YES?NSLog(@"Yes"):NSLog(@"No");

    float f = 9.9;//浮点型

    NSLog(@"f = %.2f",f);

    

//    CGFloat doubel1 = 6666.6666;//点击跳进头文件看一下


//    double double2 = 6666.6666;

    //等价

    //typedef CGFLOAT_TYPE CGFloat;

    //# define CGFLOAT_TYPE double

    /*

    //常用的结构体

    CGPoint point1 = CGPointMake(100, 100);

    //x,y坐标

    CGPoint point2 = {100,100};

    

    CGSize size1 = CGSizeMake(100, 100);

    //宽高

    CGSize size2 = {100,100};

    

    CGRect rect1 ={point1,size1};

    //记录frame位置和大小

    CGRect rect2 = CGRectMake(100, 100, 100, 100);

    

    NSRange range1 = {1,2};//简单了解

    //等价

    NSRange rang2 = NSMakeRange(1, 2);

    */

    /**

     *  fundation会讲到

         typedef struct _NSRange {

         NSUInteger location;//位置

         NSUInteger length;//长度

         } NSRange;

     */

    weather day = sunny;//给定义枚举类型赋值

    NSLog(@"day = %d",day);

    //字符串

    NSString *s = @"beiwoIT";

//    char str[100] = "\n----beiwoIT-----\n";

    //C语言写法

    char str[100];

    printf("请输入字符串:");

    scanf("%s",str);

    printf("====%s====",str);

    //OC

    NSLog(@"++++++%@+++++",s);   

    return 0;

}

面向过程与面向对象:

面向过程只考虑解决问题所需要的步骤和算法C语言就是这样的如果要实现某个功能他就需要按步骤写出函数或算法 :

第一步:

第二步:

。。。


比较独立耦合性低,可移植性高。

Objective-C语言呢相对于C更简单更符合人的思维逻辑,人们考虑要对某些事物做操作的时候,是不是先考虑操作对象是什么啊首先得有个操作对象吧,然后考虑需要操作对象干什么,我们首先得明确这个操作对象有啥特征吧,还得知道操作对象能干啥吧。OC代码的编写类似这种逻辑,这就是面向对象的思想。

类与对象:

类就好比具有相同特征的对象抽象出来的图纸,我们可以根据图纸创建我们的对象,就像飞机类,类的功能就像图纸的功能一样描述了飞机这一类对象的特征(OC里叫属性)还描述了飞机用于的功能(OC里叫做方法)。有了图纸就能根据图纸创造飞机这类对象了,对应在OC里就是用飞机类创建飞机对象,具体怎么创建在接下来有代码演示。


对象的特征:属性

属性是怎么来的呢?

对象的属性是在类中定义出来的实例变量;

对象的行为:方法

方法是怎么来的?

对象执行的方法是在类里面声明和实现的;

类是对象的类型;


不同于int基本数据类型:类是具有方法的


类的声明和实现:


代码演示:


类的声明

//-------className--ParentClassName

@interface Person : NSObject

//  |

//关键字(界面的意思与界面无关)

/**

 *  定义属性部分

 */

{

    /**

     *  属性1;

     *  属性2;

     *  属性3;

     *  属性4;

     ...

     */

    NSInteger _age;//代码习惯全局变量前面加下划线,年龄    

    BOOL _isMan;//性别,是不是男的

    NSString* _name;//姓名

    

}

//方法的声明

/**

 *  方法1;

 *  方法2;

 *  方法3;

 *  方法4;

 */

//"-"号代表实例方法,用对象来调用

//"+"号代表类方法 用类来调用


//设置器设置年纪

- (NSInteger)age;

//访问器获得年纪

- (void)setAge:(NSInteger)age;

@end




类的实现

@implementation Person

//方法的实现

//设置器设置年纪

- (NSInteger)age{

    return _age;

}

//访问器获得年纪

- (void)setAge:(NSInteger)age{

    _age = age;

}

@end

对象的创建和使用:

OC的对象通过指针来声明Person*person1;

  • OC中对象的创建,使用alloc来创建一个对象。编译器会给object对象分配一块可用的内存地址。然后需要对对象进行初始化即调用init方法,这样这个对象才可以使用

Person *person1 = [Personalloc];

person1 = [person1 init];

可嵌套使用

Person *jack = [[Personalloc] init];

[jack setName:@"jack"];

OC方法的调用:[对象 方法名];[类名 方法名];

常见错误

(1)@interface  @end@implementation  @end不能嵌套包含

(2)只有类的声明没有类的实现

(3)漏写@end

(4)两个类的声明嵌套(可以把顺序打乱)

(5)成员变量没有写在{}

(6)方法的声明写在了{}里面

(7)在声明时对类的成员变量进行初始化,请注意成员变量不能脱离对象而独立存在

(8)方法无法像函数那样的调用

(9)成员变量和方法不能用static等关键字修饰,不要和c语言混淆

(10)类的实现可以写在mian函数后面,在使用之前只要有声明就可以

OC对象与函数有着本质的区别:

(1)方法的实现只能写在@implementation··@end中,对象方法的声明只能写在@interface···@end中间

(2)对象方法都以-号开头,类方法都以+号开头

(3)对象方法只能由对象来调用,类方法只能由类来调用,不能当做函数一样调用

(4)函数属于整个文件,可以写在文件中的任何位置,包括@implementation··@end中,但写在@interface···@end会无法识别,函数的声明可以再main函数内部也可以在main函数外部。

(5)对象方法归类\对象所有

(6)函数调用不依赖与对象

(7)函数内部不能直接通过成员变量名访问对象的成员变量