zoukankan      html  css  js  c++  java
  • IOS开发学习笔记009-OC基本知识

    开始学习OC,时间不等人啊,要抓紧了。

    OC基本知识

    新建一个以.m结尾的文件,这既是oc的程序文件。在oc程序中完全兼容C语言。编译好链接类似。

    oc包含头文件是使用#import <>

    import 和include 的区别:

      1:import和include一样的包含功能

      2:import可以自动防止文件被重复拷贝

    1 #import <Foundation/NSObjCRuntime.h>//NSLog头文件
    2 //import 1:和include一样
    3 //       2:可以自动防止文件被重复拷贝
    4 int main()
    5 {
    6     NSLog(@"this is OC output");//自动换行
    7     return  0;
    8 }

    如果使用Foundation框架,则编译的时候需要添加参数 cc -c -framework Foundation a.m

    每个框架都有自己的主头文件,和框架名一样,包含所有头文件。

    如果有多个文件,编译顺序和c语言一样: cc -c one.m two.m -framework Foundation

    BOOL类型(OC特有的)

      定义:typedef signed char BOOL;

      两种取值:

      #define YES (BOOL) 1

      #define NO (BOOL) 0

     1 #import <Foundation/Foundation.h>
     2 
     3 int main()
     4 {
     5     BOOL b = YES;//1
     6     BOOL b2 = NO;//0
     7     
     8     NSLog(@"%d	%d",b,b2);//1    0
     9     return 0;
    10 }

    面向对象

    万物皆对象。

    常用术语

      面向过程 Procedure Oriented

      面向对象 Object Oriented,简称OO

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

    类和对象的区别

      类是对象的抽象。

      对象是类的实例。

    类的构成:

       1、类名

          首字母大写,不能下划线,多个单词每个首字母大写

       2、属性

       3、行为(功能)

    类的实现

     

     1 /*
     2  3  1、类名
     4     首字母大写,不能下划线,多个单词每个首字母大写
     5  2、属性
     6  3、行为(功能)
     7 */
     8 
     9 #import <Foundation/Foundation.h>//NSObject
    10 
    11 //1、类的声明:属性和行为
    12 @interface Car : NSObject//继承NSObject,使类具有创建对象的功能
    13 {
    14     //属性,也就是成员变量(实例变量),默认会初始化为0,默认是保护属性
    15     @public
    16     int wheels;//轮胎个数
    17     int speed;//时速
    18 }
    19 
    20 //方法(行为):返回值,方法名,参数
    21 //只要是oc对象的方法,必须以‘-’开头
    22 //OC方法中任何数据类型都必须用"()"括起来
    23 //OC方法中小括号就是用来括住数据类型
    24 - (void) run;
    25 
    26 @end
    27 
    28 
    29 
    30 
    31 //2、类的实现,用力实现@interface中声明的方法
    32 @implementation Car
    33 //方法的实现
    34 - (void) run
    35 {
    36     NSLog(@"Running!");
    37 }
    38 @end
    39 
    40 int main()
    41 {
    42     //创建对象,返回对象的地址
    43     Car *p = [Car new];//OC中执行任何行为都需要这个 [行为执行者 行为];
    44     p->wheels = 4;//赋值
    45     p->speed = 60;//赋值
    46     
    47     [p run];//调用方法
    48     
    49     NSLog(@"speed is %d!",p->speed);//输出速度
    50 
    51     return 0;
    52 }

    在类创建对象之前会把类加载到内存中,每个对象还都有一个ISA 指针,指向这个类。

    对象和函数的区别

    • OC方法只能声明在@interface和@end之间,只能实现在@implementation和@end之间。也就是说OC方法不能独立于类存在
    • C函数不属于类,跟类没有联系,C函数只归定义函数的文件所有
    • C函数不能访问OC对象的成员
    • 低级错误:方法有声明,但是实现的时候写成了函数
     1 #import <Foundation/Foundation.h>
     2 
     3 
     4 //1、类的声明
     5 @interface Person: NSObject
     6 {
     7     @public
     8     int age;//年龄
     9     double weight;//体重
    10 }
    11 
    12 
    13 - (void)walk;//行走
    14 
    15 @end
    16 
    17 //函数1
    18 void test(int age,int wei)
    19 {
    20     age = 20;
    21     wei = 200;
    22 }
    23 //函数2
    24 void test1(Person *p)
    25 {
    26     p->age = 20;
    27     p->weight = 200;
    28 }
    29 
    30 //2、类的实现
    31 @implementation Person
    32 //实现@interface中声明的方法
    33 - (void)walk//行走方法的实现
    34 {
    35     NSLog(@"The person whoes age is %d and weight is %f is walking !",age,weight);
    36 }
    37 
    38 @end
    39 
    40 int main()
    41 {   
    42     Person *p1 = [Person new];//新建一个对象
    43     p1->age = 25;//年龄赋值
    44     p1->weight = 66.7;//体重赋值
    45     [p1 walk];//walk方法调用
    46     
    47     Person *p2 = [Person new];//新建一个对象
    48     p2->age = 45;//年龄赋值
    49     p2->weight = 77.0;//体重赋值
    50     [p2 walk];//walk方法调用
    51     
    52     //p2 = p1;//对象间赋值
    53     
    54     //对象和函数
    55     test(p1->age,p1->weight);//值传递,不改变原值
    56     [p1 walk];//walk方法调用
    57     test1(p1);//传地址,改变原值
    58     [p1 walk];//walk方法调用
    59 
    60     return 0;
    61 }

    @interface 和@implementation分工

    @interface 就相当于钟表表面

    @implementation就是钟表内部的-实现

    常见错误

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

      2、漏了@end

      3、@interface和@implementation嵌套

      4、两个类的声明嵌套

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

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

    方法和函数的区别

     方法:

     1、方法都是以减号开头的

     2、方法声明必须写在@interface和@end之间

          方法定义必须写在@implementation和@end之间

     3、方法只能由对象来调用

     4、方法归对象/类所有

     函数:

     1、函数归文件所有,能写在除#interface和@end之间的任意位置

     2、函数调用不依赖与对象

    类的简单设计

      1 #import <Foundation/Foundation.h>
      2 /*
      3  学生类:
      4  狗类
      5  */
      6 
      7 
      8 //性别
      9 typedef enum
     10 {
     11     SexMan,//男
     12     SexWoman//女
     13 } Sex;
     14 //生日
     15 typedef struct
     16 {
     17     int year;//年
     18     int month;//月
     19     int day;//日
     20 } Date;
     21 //颜色
     22 typedef enum
     23 {
     24     ColorBlack,//黑色
     25     ColorRed,//红色
     26     ColorGreen//绿色
     27 } Color;
     28 
     29 //类的声明:狗
     30 @interface Dog : NSObject
     31 {
     32     @public
     33     double weight;//体重
     34     Color curColor;//毛色
     35 }
     36 //方法声明
     37 - (void) eat;//吃
     38 - (void) run;//走
     39 
     40 @end
     41 
     42 
     43 @implementation Dog
     44 
     45 //方法实现
     46 - (void) eat
     47 {
     48     weight += 1;
     49     NSLog(@"狗吃过体重是%f",weight);
     50 }
     51 
     52 - (void) run
     53 {
     54     weight -= 1;
     55     NSLog(@"狗溜过体重是%f",weight);
     56 }
     57 
     58 
     59 @end
     60 
     61 
     62 
     63 //类的声明 :学生
     64 @interface Student : NSObject
     65 {
     66     @public
     67     Sex sex;//性别
     68     Date birthday;//生日
     69     double weight;//体重
     70     Color FavColor;//最喜欢的颜色
     71     char *name;//姓名
     72     //狗,对象中对象,指针
     73     Dog *dog;//OC中得其他对象必须是指针
     74 }
     75 //方法声明
     76 - (void) eat;//吃
     77 - (void) run;//走
     78 - (void) print;//输出
     79 - (void) walkingDog;//遛狗
     80 - (void) feadDog;//喂狗
     81 @end
     82 
     83 //类的实现
     84 @implementation Student
     85 //方法实现
     86 - (void) eat
     87 {
     88     weight += 1;
     89     NSLog(@"吃过体重是%f",weight);
     90 }
     91 
     92 - (void) run
     93 {
     94     weight -= 1;
     95     NSLog(@"运动过体重是%f",weight);
     96 }
     97 
     98 - (void) print
     99 {
    100     NSLog(@"Sex is %d,birthday is %d-%d-%d,favourate color is %d",sex,birthday.year,birthday.month,birthday.day,FavColor);
    101 
    102 }
    103 
    104 
    105 - (void) walkingDog
    106 {
    107     [dog run];
    108 }
    109 - (void) feadDog
    110 {
    111     [dog eat];
    112 }
    113 @end
    114 
    115 
    116 
    117 int main()
    118 {
    119     Student *pStu = [Student new];//新建对象
    120     pStu->dog = [Dog new];//新建狗对象
    121     pStu->dog->weight = 20;//狗的体重
    122     pStu->dog->curColor = ColorBlack;//狗的颜色
    123     pStu->weight = 50;//学生体重
    124     
    125     pStu->sex = SexMan;//学生性别
    126     
    127     Date d = {1990,3,5};//学生年龄
    128     pStu->birthday = d;//赋值
    129     
    130     pStu->FavColor = ColorGreen;//学生最喜欢的颜色
    131     
    132     pStu->name = "ZhangSan";//学生姓名
    133     
    134     [pStu eat];//调用方法eat
    135     [pStu eat];//调用方法eat
    136     [pStu run];//调用方法run
    137     
    138     [pStu print];//调用方法print
    139     [pStu walkingDog];//调用方法
    140     [pStu feadDog];//调用方法feadDog
    141     return 0;
    142 }

    方法的参数

    oc方法中,一个参数对应一个冒号。

    - (int) pingfang:(int)num;//oc方法中,一个参数对应一个冒号. 方法名是pingfang: 包括后面的冒号。

    - (int) SumwithNum1:(int)num1 andNum2:(int)num2;//冒号前可以加描述,用于理解参数。方法名是:SumwithNum1:andNum2:

     1 #import <Foundation/Foundation.h>
     2 
     3 /*
     4  计算器类:
     5  返回数值n
     6  计算平方
     7  计算和
     8  */
     9 
    10 @interface JiSuanQi : NSObject
    11 
    12 -(double) pi;
    13 //方法名是 pingfang:
    14 - (int) pingfang:(int)num;//oc方法中,一个参数对应一个冒号
    15 //- (int) Sum:(int)a :(int)b;
    16 //方法名是:SumwithNum1:andNum2:
    17 - (int) SumwithNum1:(int)num1 andNum2:(int)num2;//冒号前可以加描述,用于理解参数
    18 @end
    19 
    20 
    21 @implementation JiSuanQi
    22 - (double) pi
    23 {
    24     return 3.14;
    25 }
    26 - (int) pingfang:(int)num//oc方法中,一个参数对应一个冒号
    27 {
    28     return num * num;
    29 }
    30 - (int) SumwithNum1:(int)num1 andNum2:(int)num2
    31 {
    32     return num1 + num2;
    33 }
    34 @end
    35 
    36 
    37 int main()
    38 {
    39     JiSuanQi *p = [JiSuanQi new];//新建对象
    40     double d= [p pi];//调用pi方法
    41     NSLog(@"%f",d);
    42     int n = [p pingfang:10];//调用平方方法
    43     NSLog(@"%d",n);
    44     //这样写比较好理解
    45     int sum = [p SumwithNum1:10 andNum2:20];//调用方法sum
    46     NSLog(@"%d",sum);
    47     return 0;
    48 }

    练习2:

     1 /*
     2  3     方法:比较车速
     4  */
     5 
     6 //
     7 @interface Car : NSObject
     8 {
     9 @public
    10     int speed;
    11 }
    12 - (int) comapreSpeedWithOther:(Car *)other;
    13 
    14 @end
    15 
    16 @implementation Car
    17 - (int) comapreSpeedWithOther:(Car *)other
    18 {
    19     return speed - other->speed;
    20 }
    21 
    22 @end
    23 
    24 int main()
    25 {
    26     Car *p1 = [Car new];
    27     Car *p2 = [Car new];
    28     p1->speed = 200;
    29     p2->speed = 300;
    30     int res = [p1 comapreSpeedWithOther:p2];
    31     NSLog(@"%d",res);
    32     return 0;
    33 }
    View Code

    匿名对象的使用

    [Car new]->speed = 300;//匿名对象

    int main()

    {

        //匿名对象,不要这样写,会造成内存泄露

        [Car new]->speed = 300;

        //不要这样写,会造成内存泄露

        [[Car new] run];

        return 0;

    }

    Xcode文档安装

    1、直接找到Xcode文件路径,把离线文件复制进去

      /Applications/Xcode.app/Contents/Developer/Documentation/DocSets

    2、放到硬盘某路径下

      /Users/用户名/Library/Developer/Shared/Documentation/DocSets

  • 相关阅读:
    Library 的打包
    Webpack 的高级概念
    前端文件下载的几种方式
    Webpack 的核心概念
    vue框架目录结构
    前端工程化的理解
    this.$nextTick
    某面试题
    React Fiber是什么
    Ant Design 在回显数据的时候报错, Error: must set key for <rc-animate> children
  • 原文地址:https://www.cnblogs.com/songliquan/p/4430383.html
Copyright © 2011-2022 走看看