【学习笔记】Objective-C_语法基础(一)

Objecitive-C基础教程-基础语法

Objective-C 是一种简单的计算机语言,设计为可以支持真正的面向对象编程。

Objective-C 通过提供类定义,方法以及属性的语法,还有其他可以提高类的动态扩展能力的结构等,扩展了标准的 ANSI C 语言。类的语法和设计主要是基于 Smalltalk,最早的面向对象编程语言之一。

如果你以前使用过其他面向对象编程语言,那么下面的信息可以帮助你学习 Objective-C 的基本语法。许多传统的面向对象概念,例如封装,继承以及多态,在 Objective-C 中都有所体现。这里有一些重要的不同,但是这些不同在这文章会表现出来,而且如果你需要还有更多详细的信息存在。

如果你从来没有使用任何编程语言编过程序,那么你至少需要在开始之前,对相关概念进行一些基础的了解。对象的使用和对象对象架构是 iPhone 程序设计的基础,理解他们如何交互对创建你的程序非常重要。想了解面向对象概念的,请参看使用 Objective-C 进行面向对象编程。

Objective-C:C的超集

Objective-Objective-C是C语言的严格超集--任何C语言程序不经修改就可以直接通过Objective-C编译器,在Objective-C中使用C语言代码也是完全合法的。Objective-C被描述为盖在C语言上的薄薄一层,因为Objective-C的原意就是在C语言主体上加入面向对象的特性。

Objective-C代码的文件扩展名

扩展名 内容类型
.h 头文件。头文件包含类,类型,函数和常数的声明。
.m 源代码文件。这是典型的源代码文件扩展名,可以包含 Objective-C 和 C 代码。
.mm 源代码文件。带有这种扩展名的源代码文件,除了可以包含Objective-C和C代码以外还可以包含C++代码。仅在你的Objective-C代码中确实需要使用C++类或者特性的时候才用这种扩展名。

当你需要在源代码中包含头文件的时候,你可以使用标准的 #include 编译选项,但是 Objective-C 提供了更好的方法。#import 选项和 #include 选项完全相同,只是它可以确保相同的文件只会被包含一次。Objective-C 的例子和文档都倾向于使用 #import,你的代码也应该是这样的。

语法

Objective-C的面向对象语法源于Smalltalk消息传递风格。所有其他非面向对象的语法,包括变量类型,预处理器(preprocessing),流程控制,函数声明与调用皆与C语言完全一致。但有些C语言语法合法代码在objective-c中表达的意思不一定相同,比如某些布尔表达式,在C语言中返回值为true,但在Objective-C若与yes直接相比较,函数将会出错,因为在Objective-C中yes的值只表示为1。
第一个 Objective-C 程序,基于Xcode :


#import <Foundation/Foundation.h>

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

    @autoreleasepool {
        NSLog(@"Hello World!");
    }

   return 0;
}

1.什么是对象?

对象是现实生活中的1个具体存在。看得见、摸得着,拿过来直接可以使用。

2.什么是类?

类是对一群具有相同特征或者行为事物的1个统称,抽象的。不能够直接使用。

案例:

食物. -->类
水果. -->类
桌子上的那一个水果. -->对象

交通工具. -->类
汽车. -->类
公司门口的那一辆奔驰. -->对象

3.类和对象之间的关系

  • 类是模板,类的对象是根据这个模板创建出来的。
  • 类模板中有什么,对象中就有什么。

4.如何设计类

类的作用:

  • 用来描述一群具有相同特征和行为的事物

设计类的三要素:

1.类的名字,你要描述这类事物的名字。
2.这类事物具有的相同的特征,这类事物拥有什么。
3.这类事物具有的共同的行为,这类事物会做什么。

5.如何找到类

  • 名词提炼法:分析整个业务流程,分析出现了哪些名词,这些名词就是你要找的类。

类的定义

问题:请问是先有类还是先有对象?

从现实的角度:一定先有对象再有类。
从代码的角度:一定先有类再有对象。

  • 如何定义类

    1.类的三要素。
    2.定义类的语法。

    a.位置:直接写在源文件之中,不要写在main函数之中。
    b.类的定义:

      ->类的声明:
     
    @interface 类名:NSObject 
     {
          这类事物具有的共同特征。将它们定义为变量。
     }
     
   功能就是一个方法。此处写方法的声明。
     
    @end
     
     ->类的实现:
     
    @implementation 类名
     
    此处写方法的实现。
     
   @end  
#import<Foundation/Foundation.h>

@interface Preson : NSObject
{
    NSString *_name;
    int _age;
    float _height;
}

@end

@implementation Preson

@end

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

    return 0;
}

注意:

  1. 类必须要有声明和实现;
  2. 类名用描述的事物名称命名,类名单词首字母必须大写
  3. NSObject
  4. 用来表示这类事物的共同的特征的变量必须要定义在@interface的大括号之中;
  5. 定义在大括号之中用来表示这类事物的共同的特征的变量叫做属性、成员变量、实例变量、字段
  6. 为类定义属性时,属性名必须以_开头。
  • 语法是固定的:
@interface 类名:NSOnject
{
   这类事物具有的共同的特征定义为变量;
   数据类型 变量名1;
   数据类型 变量名2;
   ......
}
@end

@implementation 类名

@end

6.如何创建类的对象

语法:

类名 *对象名 = [类名 new];

Preson *p1 = [Preson new];

根据Person这个类的模板,创建了1个对象的名字叫p1.
p1对象的特点:

1、可以直接使用;
2、类中定义的东西,这个对象中也有,不会多也不会少。

7.如何使用对象

  • 如何访问对象中的属性

    1.默认情况下,对象的属性是不允许被外界直接访问的;
    2.如果允许对象的属性可以被外界访问,那么就在声明属性的时候加一个@public关键字。

  • 访问对象的属性的方式

    对象名 -> 属性名 = 值;    // 为对象中的属性赋值
    对象名 -> 属性名;      // 取出属性值 (一般使用这一种取值方式)
    (*对象名).属性名;   // 取出属性值```
    
    

案例

写一个学生类, 属性:姓名 年龄 语文成绩 数学成绩 英语成绩

#import <Foundation/Foundation.h>
       @interface Student : NSObject    // 创建学生类 
       {
           @public
           NSString *_name;
           int _age;
           int _Chinese;
           int _Math;
           int _English;
       }
       @end
       @implementation Student
       @end 
       int main(int argc, const char * argv[])
       { 
               Student *s1 = [Student new];     //创建对象  
               s1->_name = @"Barry";      // 给对象赋值
               s1->_age = 18;
               s1->_Math = 100;
               s1->_English = 98;
               s1->_Chinese = 60 ;
               NSLog(@"s1对象的姓名是%@,年龄是%d,数学成绩、英语成绩、语文成绩分别是:%d,%d,%d",   //输出定义的属性值;
                     s1->_name,
                     s1->_age,
                     s1->_Math,
                     s1->_English,
                     s1->_Chinese);
       }

8.方法的声明实现调用

1.类的声明和实现

     ->类的声明 :
     
     @interface 类名:NSObject 
     {
          属性:属性表示类的特征。  
     }
     
     方法的声明,方法表示类的功能。
     
     @end
     
     ->类的实现:
     
     @implementation 类名
     
     方法的实现。
     
     @end

2.一类事物不仅具有相同的特征,还具有相同的行为。

行为就是一个功能,C语言中使用函数来表示一个功能;
OC的类具有行为,我们使用方法来表示..

方法和函数都表示一个功能。

3.无参数的方法。

  • 声明

    a.位置:在@interface的大括弧外面。

    b.语法:-(返回值类型)方法名称;

    **方法头中的数据类型一定要用小括号括起来!**
    
  • 实现

    a.位置:在@implementation之中实现;

    b.语法:将方法的声明拷贝到@implementation之中,去掉分号,加上大括号{};

  • 调用

    a.方法是无法直接调用,因为类是不能直接使用的,必须要先创建对象,那么这个对象中就有类中的属性和方法了。

    b.调用对象的方法:[对象名 方法名];

案例

#import <Foundation/Foundation.h>

@interface Porson : NSObject
{
    NSString *_name;
    int _age;
}

-(void)Run;

@end

@implementation Porson

-(void)Run{
    NSLog(@"This is Test!");
}
@end

int main(int argc, const char * argv[])
{
    Porson *p1 = [Porson new];
    
    [p1 Run];
  
}

4.有一个参数的方法

  • 声明

    a.位置:在@interface的大括弧外面。

    b.语法:-(返回值类型)方法名称:(参数类型)形参名称; 例:-(void)eat:(NSString *)foodName;

    **方法头中的数据类型一定要用小括号括起来!**
    
  • 实现

    a.位置:在@implementation之中实现;

    b.语法:将方法的声明拷贝到@implementation之中,去掉分号,加上大括号{}将方法实现的代码写在大括号之中;

  • 调用

    a.方法是无法直接调用,因为类是不能直接使用的,必须要先创建对象,那么这个对象中就有类中的属性和方法了。

    b.调用的语法:[对象名 方法名:实参];

案例

#import <Foundation/Foundation.h>

@interface Porson : NSObject
{
    NSString *_name;
    int _age;
}

-(void)eat:(NSString *)foodName;

@end

@implementation Porson

-(void)eat:(NSString *)foodName{
    
    NSLog(@"主人给我的%@真好吃!",foodName);
    
}
@end

int main(int argc, const char * argv[])
{
    Porson *p1 = [Porson new];
    
    [p1 eat:@"红烧肉"];
  
}

5.带多个参数的方法

  • 声明

    a.位置:在@interface的大括弧外面。

    b.语法:-(返回值类型)方法名称:(参数类型)形参名称1 方法名称:(参数类型)形参名称2 :(参数类型)形参名称3;

    例:-(int)sum:(int)num1 :(int)num2 :(int)num3;

  **方法头中的数据类型一定要用小括号括起来!**
  • 实现

    a.位置:在@implementation之中实现;

    b.语法:将方法的声明拷贝到@implementation之中,去掉分号,加上大括号{}将方法实现的代码写在大括号之中;

  • 调用

    a.方法是无法直接调用,因为类是不能直接使用的,必须要先创建对象,那么这个对象中就有类中的属性和方法了。

    b.调用的语法:[对象名 方法名:实参1 :实参2 :实参3];

案例

#import <Foundation/Foundation.h>

@interface Porson : NSObject
{
    NSString *_name;
    int _age;
}

-(int)sum:(int)num1 :(int)num2 :(int)num3;

@end

@implementation Porson

-(int)sum:(int)num1 :(int)num2 :(int)num3{
    
    int num4 = num1 + num2 + num3;
    
    return num4;
    
}
@end

int main(int argc, const char * argv[])
{
    Porson *p1 = [Porson new];
    
    int sum = [p1 sum:10 :10 :25];
    
    NSLog(@"num4 = %d",sum);
  
}

带参数的方法声明规范

1.如果方法只有一个参数

要求最好这个方法的名字叫做 xxxWith:
例:-(void)eatWith:(NSString *)foodName; //调用方法时,增强代码的完整可读性

2.如果方法有多个参数

要求最好这个方法的名字叫做xxxWith:(参数类型)参数名称 and:(参数类型)参数名称 and:(参数类型)参数名称 and:
例1: -(void)sumWith:(int)num1 and:(int)num2 and:(int)num3;
例2: -(void)sumWithNum1:(int)Num1 andNum2:(int)Num2 andNum3:(int)Num3;

注意:

  • 同一个类可以创建无数个对象;
  • 同一个类的多个对象之间毫无关系,虽然它们拥有相同类型的属性和方法,属性的值是不会相互影响的;
  • 在方法实现当中,可以直接访问属性;此方法是通过哪一个对象来调用的,那么方法中的直接访问的属性就是哪个对象的

案例

写一个Student类, 属性: 体重;

方法1: 跑步: 每跑一次步,体重-0.5;
方法2: 吃饭: 每吃一次饭,体重+0.7;

 #import <Foundation/Foundation.h>
    
    @interface Student : NSObject
    {
        @public
        NSString *_name;
        float _weight;
    }
    
    - (void)Run;
    - (void)Eat;
    
    @end
   
    @implementation Student
    
    - (void)Run{
            
            NSLog(@"跑步,每跑一次,%@的体重就轻了!",_name);
            
        _Weight -= 0.5f ;
            
            NSLog(@"跑完了,%@的体重是%.2f!",_name,_weight);
                 
        }
        
    - (void)Eat{
            
            NSLog(@"吃东西,每吃一次,%@的体重就增长了!",_name);
            
           _weight += 0.7f ;
           
            NSLog(@"吃完了,%@的体重是%.2f",_name,_weight);
       }
        
   @end
              
        int main(int argc, const char * argv[])
       {
           Student *p1 = [Student new];
            
           p1->_name = @"Barry";
            
            p1->_weight = 99.9f ;
           
           [p1 Run];
           [p1 Eat];
           [p1 Run];
           [p1 Eat];                      
        }

9.作业

设计一个“Student”类
1.属性

姓名
生日
年龄
身高(单位是m)
体重(单位是kg)
性别
C语言成绩
OC成绩
IOS成绩

2.行为

跑步:每跑一次,身高增加1cm,体重减少0.5kg,输出跑完后的体重;
吃饭:每吃一次,身高增加1cm,体重增加0.5kg,输出吃完后的体重;
学习:每学习一次,3科成绩各增加1分,输出学习完后的3科成绩。

计算总分:算出3科成绩的总分并打印;
计算平均分:算出3科成绩的平均分并打印。

总结

【学习笔记】(一)是对Objective-C的简要介绍,是本人根据网络资源的学习,自我编辑的这份笔记,这也算是自己向Ios开发之路的第一步吧!

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,542评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,596评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,021评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,682评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,792评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,985评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,107评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,845评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,299评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,612评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,747评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,441评论 4 333
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,072评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,828评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,069评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,545评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,658评论 2 350

推荐阅读更多精彩内容