• objective-c 语法快速过(2)


    oc类的声明和定义的常见错误

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

    2、漏了@end

    3、@interface和@implementation嵌套,也就是@interface或者@implementation和@end必须成对出现!两者中间不能嵌套任何别的。

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

    5、方法的声明写在了声明的大括号里面,或者方法的实现写在了声明里。这都是不对的。

    6、忘记了:NSObject

    7、想直接修改类成员变量,但是没有设置为@public

    8、类的声明里的实例变量,不能在声明的时候初始化。

    9、不能把成员变量当做c语言的变量,比如加static,不对!类的声明里只能写类的成员变量名

    10、记住:方法是方法,函数是函数,也不能给方法加比如static。没有这个东西

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

    12、方法不能当做函数一样调用或者声明,对象方法只能是对象来调用

    13、类的实现可写在main函数的后面,只要在类的声明后面就行了

    14、记住:oc里对象方法名包含冒号,oc不允许方法名一样,-或者+不是方法名

    OC方法和函数的区别

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

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

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

    4、低级错误:方法有声明,但是实现的时候写成了函数

    5、oc的函数可以写在文件的任何位置(除@interface和@end之间除外,可以写在类的实现里),归文件所有

    OC的方法使用注意

    1、方法只有声明,没有实现(这是经典错误

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

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

    4、没有@interface,只有@implementation,也能成功定义一个类

    @implementation Car : NSObject
    {
    
        @public
    
        int wheels; // 轮子
    
        int speed; // 时速
    
    }
    //方法就不用声明了,直接在类的实现里写定义即可
    - (void) run
    
    {
        NSLog(@"%i个轮子,%i时速的车子跑起来了", wheels, speed);
    }
    
    @end

    类里涉及到声明性别,时间等

    如果用布尔类型定义性别,不太好,容易让外人搞混,不利于团队的代码共享。如果属性只有几个固定的取值,那么最好用枚举。

    对于年月日的声明不要写成这样,很傻,很累,

      //int year;
    
        //int month;
    
        //int day;

     使用结构体

      Date birthday;//生日结构
    
      double weight;//体重
    
      Color favourColor;//最喜欢的颜色枚举
    Sex sex;//性别枚举

    程序代码如下:

      1 /* 设计一个学生类
      2  类名:学生
      3  成员变量:姓名,性别,生日,体重,喜欢的颜色,每个学生都养一条狗(狗也是一个对象)
      4  方法:吃饭,锻炼,遛狗(让狗run),喂狗(让狗eat)
      5 */
      6 #import <Foundation/Foundation.h>
      7 typedef enum
      8 {
      9     //标准写法,枚举常量名字含有枚举类型的名字,一目了然,容易阅读
     10     SexMan,//0
     11     SexWoman//1
     12 } Sex;
     13 
     14 typedef struct{
     15     int year;
     16     int month;
     17     int day;
     18 } Date;
     19 
     20 typedef enum{
     21     ColorBlack,//0
     22     ColorWright,//1
     23     ColorRed//2
     24 } Color;
     25 
     26 //狗类声明
     27 //成员变量:体重,毛色
     28 //方法:吃东西,跑
     29 @interface Dog : NSObject
     30 {
     31     @public
     32     double hairColor;//毛色
     33     double weight;//体重
     34 }
     35 - (void) eat;
     36 - (void) run;
     37 @end
     38 //狗类实现
     39 @implementation Dog
     40 - (void) eat
     41 {
     42    
     43     weight += 1;
     44     NSLog(@"喂狗饭,体重是%f", weight);
     45 }
     46 - (void) run
     47 {
     48     weight -= 1;
     49     NSLog(@"遛狗后,体重是%f", weight);
     50 }
     51 @end
     52 //学生类声明
     53 @interface Student : NSObject
     54 {
     55     @public
     56     char *name;//姓名
     57     //如果用布尔类型定义性别,不太好,容易让外人搞混,不利于团队的代码共享,BOOL sex;要么男,要么女,YES or NO
     58     //如果属性只有几个固定的取值,那么最好用枚举
     59     Sex sex;//性别枚举
     60     //不要写成这样,很傻,很累,使用结构体
     61     //int year;
     62     //int month;
     63     //int day;
     64     Date birthday;//生日结构
     65     double weight;//体重
     66     Color favourColor;//最喜欢的颜色枚举
     67     //每个学生都养一条狗,必须用指针,oc的对象都是用指针来操作的!
     68     Dog *dog;
     69 }
     70 //类的声明里,任何数据类型都是可以声明的,对象方法的声明,不在花括号里,但是在类的声明范围内写
     71 - (void) eat;
     72 - (void) exercise;
     73 - (void) print;//打印全部信息
     74 - (void) walkTheDog;//遛狗
     75 - (void) feedTheDog;//喂狗
     76 @end
     77 //设计到这一步,类还没完成,如果没有类的实现,编译没事,但是链接会报错。必须有类的实现
     78 @implementation Student
     79 - (void) eat
     80 {
     81    
     82     weight += 1; //每吃一顿,体重增加一公斤
     83     NSLog(@"吃完饭,体重是%f", weight);
     84 }
     85 - (void) exercise
     86 {
     87     weight -= 1;    //每次锻炼,体重减少一公斤
     88     NSLog(@"锻炼后,体重是%f", weight);
     89 }
     90 - (void) print
     91 {
     92     NSLog(@"性别 = %d, 喜欢的颜色 = %d, 姓名= %s, 生日 = %d-%d-%d", sex, favourColor, name, birthday.year, birthday.month, birthday.day);
     93 }
     94 - (void) walkTheDog
     95 {
     96     //调用狗类对象的run方法,这是面向对象思维的体现
     97     [dog run];
     98    
     99 }
    100 - (void) feedTheDog
    101 {
    102     [dog eat];
    103 }
    104 @end
    105 
    106 int main()
    107 {
    108     Student *student = [Student new];
    109     student->weight = 50;  //体重
    110     student->sex = SexMan;    //性别    
    111 //下面的写法不对,只有在定义结构体变量的同时初始化是合法的,而现在因为已经存在了结构体的变量(类声明里),不可以用下面的方法再次直接去初始化,否则报错
    112     //student->birthday = {1990, 11, 11};//生日
    113 
    114 //可以用下面的方法,重定义生日结构新的变量,同时初始化,再赋值给birthday
    115     //Date date = {1990, 11, 11};
    116     //student->birthday = date;
    117     
    118 //或者使用下面的方法,使用指针去访问结构体变量birthday,再使用结构体变量访问里面的结构体成员,去赋值
    119     student->birthday.year = 1990;
    120     student->birthday.month = 5;
    121     student->birthday.day = 28;
    122     
    123     //最喜欢的颜色
    124     student->favourColor = ColorBlack;
    125     //姓名
    126     student->name = "dashuai";
    127     //学生类内部的狗的指针成员去指向一个狗类的一个对象(也就是一条狗)
    128     Dog *d = [Dog new];//创建狗类的一个对象,用d指向
    129     d->hairColor = ColorWright;
    130     d->weight = 20;//访问狗类的成员
    131     student->dog = d;//把这个狗类的对象赋值给学生类里狗类的指针,被该指针指向,学生就可以操作狗的对象了
    132     [student walkTheDog];
    133     [student feedTheDog];
    134     [student print];
    135 
    136 //    [student eat];
    137 //    [student eat];
    138 //    [student exercise];
    139 //    [student exercise];
    140     return 0;
    141 }

    Xcode 的代码提示功能的关闭和开启

    再次熟悉下,oc 里方法名,方法类型,返回值类型,方法参数的部分

    开发 IOS 到一定程度,要习惯看苹果的官方文档

    oc 里的数据类型

    Object-c提供基本数据类型:int 、float 、double 、char

    int:

    八进制 ,整型第一位为 0, NSLog 的格式符为: %o ,显示的八进制不带前导 0

    十六进制 ,以 0x 开头的整型,NSLog 的格式符为: 若(%X 或%#X) 显示的十六进制用大写

    %#o 显示的八进制带前导0

    %x 显示的十六进制不带前导 0x

    %#x 显示的十六进制带前导0x

    float:
    NSLog 的格式符:%f
    NSLog 的格式符:%e 科学计数法显示值
    NSLog 的格式符:%g 指数的值小于-4 大于 5,采用%e,否则采用%f

    十六进制的浮点常量包含前导 0x 或 0X,后面紧跟一个或多个十进制或十六进制数字,再后是p 或 P,最后,是可以带符号的二进制指数。例:0x0.3p10 表示的值为 3/16*2^10

    注:若无特殊说明,Object-c 将所有的浮点常量看做 double 值,要显示 double 值可使用和 float一样的格式符。

    char:

    NSLog 的格式符:%c

    long double 常量写成尾部带有字母 l 或者 L 的浮点常量。1.234e+7L


    注:id 类型可以通过类型转化符可以将一般的id 类型的对象转换成特定的对象。

    _Bool ;处理 Boolean(即 0 或 1)

    _Complex;处理复数
    _Imaginary;处理抽象数字 

    键盘输入:

    int number;
    
    scanf("%i",&number); 

    实例变量的初始化值默认为 0 

    实例变量作用域的指令:

    @protected;实例变量可被该类及任何子类中定义的方法直接访问(默认的情况)

    @private;实例变量可被定义在该类的方法直接访问,不能被子类定义的方法直接访问。

    @public;实例变量可被该类中定义的方法直接访问,也可被其他类或模块中定义的方法访问。使得其他方法或函数可以通过(->)来访问实例变量(不推荐用) 。

    @package;对于 64 位图像,可以在实现该类的图像的任何地方访问这个实例变量。 

     

    在类中定义静态变量和 C 一样

    voaltile说明符和const 正好相反,明确告诉编译器,指定类型变量的值会改变。(I/O端口)

    比如要将输出端口的地址存储在 outPort 的变量中。

    volatile char *outPort;
    *outPort = 'O';
    *outPort = 'N';

    这样就可以避免编译器将第一个赋值语句从程序中删除 。

    枚举数据类型、typedef 语法以及数据类型的转换和 C 也是一样。 

    欢迎关注

    dashuai的博客是终身学习践行者,大厂程序员,且专注于工作经验、学习笔记的分享和日常吐槽,包括但不限于互联网行业,附带分享一些PDF电子书,资料,帮忙内推,欢迎拍砖!

  • 相关阅读:
    .ini文件的介绍及对其进行操作
    一些.net 控件使用的小细节
    三、类型设计规范
    [转]TimerCallback 委托
    [转]简单XML文件C#操作方法
    [转]用托盘控制windows服务的c#实现
    [转]DateTime相关
    [转]创建Windows服务 C#
    一、框架设计的基础
    [转]得到当前执行的函数名、码行、源代码文件名
  • 原文地址:https://www.cnblogs.com/kubixuesheng/p/4307783.html
Copyright © 2020-2023  润新知