[41→100] object-c语法精要

看完征战Objective-CObjective-C面向对象初体验
发现Object-C的语法和C语言是一致的,用官方表述来说,就是OC是C的超集,完全支持C的语法。

在磁盘存储的物理形式上,OC头文件后缀名为.h,实现文件后缀名为.m,与c++混写的实现文件后缀名为.mm

准备工作:用xCode做oc开发必备技巧

/**
 *  必备插件:
 *  1. Xcode plug-in:快速生成格式化的注释 [VVDocumenter-Xcode](https://github.com/onevcat/VVDocumenter-Xcode)
 *  必须记住的快捷键:
 *  * 格式化代码(重排缩进):ctrl+i
 *  * 生成格式化注释: ///
 *  * 折叠、展开代码段 option+cmd+ ← | →
 *  * 在h和m文件间切换:cmd+ctrl+向上的方向键 
 */

直接写代码感受下吧。下面这个Main方法中展示的OC的基本语法结构,包括

  • 变量与数据类型
  • 条件控制语句
  • 循环控制语句
  • 函数
  • 面向对象的封装、继承、多态

参考代码:

Main中引入了两个类:一个父类People、一个子类Man

//
//  main.m
//  HelloObjC
//
//  Created by shitianci on 16/5/25.
//  Copyright © 2016年 Panda. All rights reserved.
//

#import <Foundation/Foundation.h>
#import "People.h"
#import "Man.h"


/**
 *  求面积的函数
 *
 *  @param width  宽
 *  @param height 高
 *
 *  @return <#return value description#>
 */
double getArea(double width, double height){
    return width*height;
}


/**
 *  打印主函数的信息
 *
 *  @param argc 参数个数
 *  @param argv 参数列表
 *
 */
void showInfo(int argc, const char * argv[]) {
    NSLog(@"传入参数%d个", argc);
    for (int i = 0; i < argc; i++) {
        NSLog(@"argv[%d] = %s", i, argv[i]);
    }
    return;
}

/**
 *  入口函数
 *
 *  @param argc 参数个数
 *  @param argv 参数列表
 *
 *  @return 执行结果
 */
int main(int argc, const char * argv[]) {
    @autoreleasepool {
        /**
         *  必备插件:
         *  1. Xcode plug-in:快速生成格式化的注释 [VVDocumenter-Xcode](https://github.com/onevcat/VVDocumenter-Xcode)
         *  必须记住的快捷键:
         *  * 格式化代码(重排缩进):ctrl+i
         *  * 生成格式化注释: ///
         *  * 折叠、展开代码段 option+cmd+ ← | →
         *  * 在h和m文件间切换:cmd+ctrl+向上的方向键
         */
        @autoreleasepool {
            NSLog(@"Hello, %s, Welcome Object C World!" , "Panda");

            showInfo(argc, argv);

#pragma mark 变量与数据类型
            /**
             * 变量
             */
            {
                int i = 1;   //32bits, 4bytes
                short s = 1; //16bits, 2bytes
                long l = 1L;  //32bits, 4bytes
                long long ll = 1LL;  //64bits, 8bytes
                unsigned int ui = 1;
                signed int si = -1;

                float f = 0.1;
                double d = 100.0;

                char c = 'A';
                char *string = "string";
                NSLog(@"基础数据类型:\n  \t int: %d,\n  \t float: %f,\n \t double: %lf,\n \t char: %c,\n \t string: %s\n" , i,f,d,c,string);
            }

            /**
             *  表达式:跟C语言一致
             */
            {
                int a = 1;
                NSLog(@"\n\ta 等于 %d, a++ 等于 %d", a, a++);
                NSLog(@"\n\ta 等于 %d, ++a 等于 %d", a, ++a);
                NSLog(@"\n\ta 等于 %d, a++ 等于 %d", a, a++);

                int b = 2;
                int c = 5;
                int d = 31;
                float f = 100.0f;
                NSLog(@"\n\t  (((a+b)*c)%%d)/f 等于 %f", (((a+b)*c)%d)/f);
            }

#pragma mark 条件控制语句

            /**
             *  分支语句if
             */
            {
                int a = 1;
                int b = 2;
                if(a < b && 0 && YES){
                    NSLog(@"这句话是真的");
                }
                else if(!NO){
                    NSLog(@"这句话是假的");
                }
            }

            /**
             *  高级跳转语句goto
             */

            {
                int i = 0;
            a:

                i++;
                NSLog(@"i = %d", i);
                if(i < 5){
                    goto a;
                }
                else{
                    goto b;
                    NSLog(@"不会被执行到哦~");
                }
            b:
                NSLog(@"跳到b了");
            }

            /**
             *  switch分支语句
             */
            {
                int i = 10;
                switch (i) {
                    default:
                        NSLog(@"switch: i的值超出范围");
                        //                    break;
                    case 1:
                        NSLog(@"switch: i的值等于1");
                        break;
                    case 2:
                        NSLog(@"switch: i的值等于2");
                        break;


                }
            }

#pragma mark 循环控制语句
            {
                int i = 0;
                while (i < 5) {
                    i++;
                    NSLog(@"while: i = %d", i);
                }

                do {
                    i++;
                    NSLog(@" do …… while: i = %d", i);
                } while (i < 5);

                int j;
                for (j = 0; j < 100 ;j++) {
                    if(j > 10){
                        break;
                    }
                    else if(j > 5){
                        NSLog(@"continue: j = %d", j);
                        continue;
                    }
                    NSLog(@"for: j = %d", j);
                }
                NSLog(@"break: j = %d", j);
            }
        }

#pragma mark 函数
        {
            double width = 10.0;
            double height = 6.0;
            NSLog(@"width = %f, height = %f, area = %f", width, height, getArea(width, height));

        }

#pragma mark 面向对象

        {
            /**
             初始化
             */
            People *p1 = [[People alloc]init];
            People *p2 = [People new];
            NSLog(@"p1 - %p", p1);
            NSLog(@"p2 - %p", p2);

            /**
             *  成员变量和属性
             */
            NSLog(@"p1.peopleName - %@", p1.peopleName);
//            NSLog(@"p1.peopleName - %s", [p1 peopleName]);
            p2.peopleName = @"栗色";
            NSLog(@"p2.peopleName - %@", p2.peopleName);

            /**
             *  方法
             */
            NSLog(p2->_peopleOut);
            [p2 testSubtractMethod];
            [People testAddMethod];
            [p2 showWithA:1];
            [p2 showWithA:1 andB:2];
            [p2 :1 :2];

            People *p3 = [[People alloc]initWithPeopleName:@"王五" andPeopleAge:18];
            [p3 showBaseInfo];

            /**
             *  封装、继承、多态(oc只支持方法重写、不支持方法重载)
             */
            Man *man = [[Man alloc]init];
            [man showBaseInfo];
        }

    }

    return 0;
}
//
//  People.h
//  HelloObjC
//
//  Created by shitianci on 16/6/6.
//  Copyright © 2016年 Panda. All rights reserved.
//

#import <Foundation/Foundation.h>

/**
 *  人(oc不支持多继承)
 */
@interface People : NSObject

/**
 *  成员变量(默认为类内使用)
 */
{
@public //可以在类外用 ->方式 进行调用,(不推荐这样使用)
    NSString *_peopleOut;
    //    NSString *_peopleName;

@protected //在类内可以使用,在类外不行,子类可以使用(默认值)
    int _peopleAge;

@private //在类内可以使用,在类外不行,子类不可以使用(默认值)
    int _peopleSex;

@package //框架权限,在框架内相当于@protected,在框架外相当于@private

}


/**
 *  属性是成员变量的外部接口,替代相应的get、set方法
 */
@property(nonatomic, strong) NSString *peopleName;

- (void) testSubtractMethod;
+ (void) testAddMethod;

//方法名为 "showWithA:"
- (int) showWithA:(int) a;
//方法名为 "showWithA: andB:"
- (int) showWithA:(int) a andB:(int)b;

//方法名为 ": :"
- (int) :(int) a :(int)b;

- (void)showBaseInfo;
- (instancetype)initWithPeopleName:(NSString * )peopleName andPeopleAge:(int)peopleAge;
@end
//
//  People.m
//  HelloObjC
//
//  Created by shitianci on 16/6/6.
//  Copyright © 2016年 Panda. All rights reserved.
//

#import "People.h"

@implementation People

//成员
//@synthesize peopleName = _peopleName;

/**
 *  重写初始化方法
 *
 *  @return 对象本身
 */
- (instancetype)init
{
    self = [super init];
    if (self) {
        _peopleName = @"张三"; //系统会根据属性默认生成 _peopleName 这个成员变量
        _peopleOut = @"直接调用对象成员变量(不推荐)";
    }
    return self;
}

- (void)showBaseInfo
{

    NSLog(@"_peopleName: %@", _peopleName);
    NSLog(@"_peopleAge: %d", _peopleAge);
    NSLog(@"_peopleOut: %@", _peopleOut);
}

- (instancetype)initWithPeopleName:(NSString * )peopleName andPeopleAge:(int)peopleAge
{
    self = [self init];
    if (self) {
        _peopleName = peopleName; //系统会根据属性默认生成 _peopleName 这个成员变量
        _peopleAge = peopleAge;
    }
    return self;
}

- (void)testSubtractMethod
{
    NSLog(@"这是一个减号方法");
}

+ (void)testAddMethod
{
    NSLog(@"这是一个加号方法");
}

- (int)showWithA:(int)a
{
    NSLog(@"方法 showWithA 携带参数 a = %d", a);
    return a;
}

- (int)showWithA:(int)a andB:(int)b
{
    NSLog(@"方法 showWithA andB 携带参数 a = %d,b = %d", a, b);
    return a+b;
}

- (int) :(int) a :(int)b
{
    NSLog(@"方法 : : 携带参数 a = %d,b = %d", a, b);
    return a+b;
}

@end
//
//  Man.h
//  HelloObjC
//
//  Created by shitianci on 16/6/6.
//  Copyright © 2016年 Panda. All rights reserved.
//

#import "People.h"

@interface Man : People

@end
//
//  Man.m
//  HelloObjC
//
//  Created by shitianci on 16/6/6.
//  Copyright © 2016年 Panda. All rights reserved.
//

#import "Man.h"

@implementation Man

- (void)showBaseInfo
{
    NSLog(@"This is a Man。");
    [super showBaseInfo];
}


@end

Panda
2016-06-06

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

推荐阅读更多精彩内容