黑马程序员技术交流社区

标题: OC简单认知 [打印本页]

作者: 八寒地狱    时间: 2014-10-19 00:36
标题: OC简单认知
   一 OC 初认知

       OC 是在C 语言的接触上,增加了面向对象的语法,完全兼容C语言,可以在OC代码中混入C语言,甚至C++

     OC可以用来开发 MAC OS X 平台和 iOS平台的应用程序。

     二  OC 语法

   1   关键字

     基本上所有关键字都以@开头,

   OC 常见关键字  @protocol、@optional、@required、@class

                          @property、@synthesize、@dynamic

                          self、super、id、_cmd、__block、__strong、__weak、

                         @interface、@implementation、@end

                         @public、@protected、@private、@selector

                         @try、@catch、@throw、@finally  

   2 字符串以@开头

   例如 @"hello OC"

    3  其他语法

   基本数据类型 包括:  char int float double bool (YES/NO)

   基本语句  

   循环语句(do while .while.for)

   条件语句 (if, if-else.switch)

    屏幕输出  NSLog(@"")



     4 终端指令

   编译 cc -c main.m

   链接 cc main.o - framework foundation

   运行  ./a.out

    5 NSLog与printf的区别

  NSLog接收OC字符串作为参数,printf接收C语言字符串作为参数

NSLog输出后会自动换行,printf输出后不会自动换行

使用NSLog需要#import <Foundation/Foundation.h>

使用printf需要#include <stdio.h>

    6  #import 的作用

          跟#include一样,用来拷贝某个文件的内容

   可以自动防止文件内容被拷贝多次,也就以为着头文件中不用加入下面的预处理指令了

     7    Foundation框架的作用

             开发OC、iOS、Mac程序必备的框架

             此框架中包含了很多常用的API(应用编程接口)

            框架中包含了很多头文件,若想使用整个框架的内容,包含它的主头文件即可

   三     面向对象和面向过程思想

      面向过程关注的是解决问题需要哪些步骤;面向对象关注的是解决问题需要哪些对象 决问题的目的,但是解决思路不一样

      面向对象是告诉对象去干什么,至于怎么实现不去关心,

      面向对象编程 Object Oriented Programming,简称OOP

   现实生活中面向对象的例子

   想打电话\发短信 à 找手机,不用分析电话要怎样才能拨通

   去饭店吃饭 à 找服务员,不用分析怎么到厨房炒菜

   汽车坏了 à 找汽车维修工,不用分析修车的步骤

境界:万物皆对象

四  类和对象的关系

1    OC中类相当于图纸,用来描述一类事物。也就是说,要想创建对象,必须先有类

2    OC利用类来创建对象,对象是类的具体存在

3     面向对象解决问题应该是先考虑需要设计哪些类,再利用类创建多少个对象

   OC 中一般分两步实现类和对象,类的声明,类的实现

类的声明 步骤

编写代码 定义 一个类拥有一定的属性  属性和类的命名规则依据标识符的规则 命名有意义驼峰标志,首字母大写字母

#import <Foundation/Foundation.h>

@interface Car : NSObject

{

    @public

    int wheels; // 多少个轮子

    int speed; // 时速

}

- (void)run; // 跑的行为

@end

2 成员变量

@interface的大括号声明的变量:wheels,speed 默认会初始化为0

3  @public可以让Car对象的wheels和speed属性被外界访问

4  加上NSOBject目的让car拥有创建对象的能力

类的实现  

@implementation Car

- (void) run

{

    NSLog(@"%i个轮子,%i时速的车子跑起来了", wheels, speed);

}

@end

主函数编写

int main()

{

    // 创建车子对象

    Car *c = [Car new];

    c->wheels = 3;

    c->speed = 300;

   

    [c run];用一个指针变量c指向内存中的Car对象

设置车子对象的属性

跟用指向结构体的指针访问结构体属性一样,用->

c->wheels = 3;

c->speed = 300;



    return 0;

[Car new]每次都会创建出新的对象,并且返回对象的地址,那么就应该用一个指针变量保存对象的地址

Car *c = [Car new]



}

对象与函数参数

  对象成员变量作为函数参数

指向对象的指针作为函数参数

  修改指向指向对象的成员

修改指针的指向

四  类的声明和实现

1 常见错误

只有类的声明,没有类的实现

漏了@end

@interface和@implementation嵌套

两个类的声明嵌套

成员变量没有写在括号里面

方法的声明写在了大括号里面

   2     语法细节

         成员变量不能在{}中进行初始化、不能被直接拿出去访问

方法不能当做函数一样调用

成员变量\方法不能用static等关键字修饰

类的实现可用写在main函数的后面,主要在声明后面就行了

3     OC方法和函数的区别

             C方法只能声明在@interface和@end之间,只能实现在@implementation和@end之间。也就是说OC方法不能独立于类存在

             C函数不属于类,跟类没有联系,C函数只归定义函数的文件所有

   C函数不能访问OC对象的成员

4    OC的方法注意

方法只有声明,没有实现(经典错误)

方法没有声明,只有实现(编译器警告,但是能调用,OC的弱语法)

编译的时候:访问没有的成员变量直接报错,访问没有的方法,只是警告

5  方法调用







6       方法名注意

冒号也是方法名的一部分

同一个类中不允许两个对象方法同名

五 get 方法 和 set方法

1  @public的成员可以被随意赋值,应该使用set方法和get方法来管理成员的访问

2  set方法 作用:用来设置成员变量,可以在方法里面过滤掉一些不合理的值

命名规范: 方法都是以set开头,而且后面跟上成员变量名,成员变量名的首字母必须大写

形参名称不要跟成员变量同名

3 get方法

作用:返回对象内部的成员变量

命名规范:get方法的名称一般就跟成员变量同名

4. 成员变量的命名规范

成员变量都以下划线 _ 开头

可以跟get方法的名称区分开

可以跟其他局部变量区分开,一看到下划线开头的变量,肯定是成员变

  实例

/* 人 类名:Person属性(成员变量\实例变量):体重、年龄行为(方法):走路、吃*/

#import <Foundation/Foundation.h>

/*

1.类的声明 * 成员变量 * 方法的声明 */

@interface Person : NSObject

{

    @public

    int age;

    double weight;

}

- (void)walk;

- (void)eat;

@end

// 2.类的实现

@implementation Person



// 实现@interface中声明的方法

- (void)walk

{

    NSLog(@"%d岁、%f公斤的人走了一段路", age, weight);

}



- (void)eat

{

    NSLog(@"%d岁、%f公斤的人在吃东西", age, weight);

}



@end



int main()

{

    // 在使用类创建对象之前,会将类加载进内存

    Person *p = [Person new];

    p->age = 20;

    p->weight = 40;

   

    [p eat];

    [p walk];

   

    Person *p2 = [Person new];

    p2->age = 30;

    p2->weight = 60;

    [p2 eat];

    [p2 walk];

5      封装的好处

  过滤不合理的值

  屏蔽内部的赋值过程

  让外界不必关注内部的细节

五 类方法

类方法直接可以用类名来执行的方法

类方法和对象方法对比

1) 对象方法

以减号-开头

只能让对象调用,没有对象,这个方法根本不可能被执行

对象方法能访问实例变量(成员变量)

2) 类方法

以加号+开头

只能用类名调用,对象不能调用

类方法中不能访问实例变量(成员变量)

使用场合:当不需要访问成员变量的时候,尽量用类方法

类方法和对象方法可以同名

3 self 关键字



1. 成员变量和局部变量同名

当成员变量和局部变量同名时,采取就近原则,访问的是局部变量

用self访问成员变量,区分同名的局部变量

2. 使用细节

出现的地方:所有的OC方法中(对象方法\类方法),不能出现在函数

作用 使用 "self->成员变量名" 访问当前方法调用的成员变量

使用 "[self 方法名];" 来调用方法(对象方法\类方法)

3. 常见错误

低级错误:用self去调用函数

类方法中用self调用对象方法,对象方法中用self调用类方法

       self死循环

作者: 孙林    时间: 2014-10-19 00:55
笔记不错,顶一个。加油。
作者: 小龟快跑驾    时间: 2014-10-19 07:43
加油加油....共同努力
作者: 微雨独行    时间: 2014-10-19 08:22
加油 楼主  稍微排下版 就更好了
作者: 哈利梅    时间: 2014-10-19 11:02
真心不错,加油!!!
作者: LeeWong    时间: 2014-10-19 21:10
笔记认真啊~~~~~~~~~~
作者: wehuazi    时间: 2014-10-19 21:17
整理的不错,学习了
作者: 八寒地狱    时间: 2014-10-19 22:44
孙林 发表于 2014-10-19 00:55
笔记不错,顶一个。加油。

谢谢,一起加油
作者: 邬建平    时间: 2014-10-19 22:55
是的 非常好  非常强大
作者: bhr756052342    时间: 2014-10-20 00:32
整理的真好。
作者: 姚先生    时间: 2014-10-20 10:33
不错哟,搂搂加油
作者: 杰克船长    时间: 2014-10-20 13:56
不错不错,浏览一遍
作者: qiusiyu    时间: 2014-10-21 07:30
这份总结很不错很不错,通俗易懂




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