zoukankan      html  css  js  c++  java
  • Objective-C基础笔记(1)基本概念和第一个程序

    一、基本概念

    Objective-C(简称OC)是iOS开发的核心语言,苹果公司在维护,在开发过程中也会配合着使用C语言、C++,OC主要负责UI界面,C语言、C++可用于图形处理。C语言是面向过程的语言,OC是在C语言基础上加上了一层面向对象的语法(将复杂面向对象语法去掉了)。我们可以使用OC开发Mac OS X平台和IOS平台的应用程序。

    2014年10月编程语言排行榜(http://www.tiobe.com/index.php/content/paperinfo/tpci/index.html)


    从这个排行榜上可以看到,高居榜首的还是c、java、object-c、c++、c#、php、python、javascript.

    注意:

    1、Objective-C是没有包的概念的,也就是没有命名空间机制,而是通过给类名添加前缀来防止类名冲突。

    2、Objective-C中的关键字以@开头,防止和c/c++的关键字冲突。

    3、Objective-C中的字符串以@开头。

    语法:


    需要注意的是上面的红色字部分:

    BOOL类型(YESNO)其实就是1和0

    nil相当于Java中的null

    self相当于Java中的this

    for(xx in xx)和javascript的快速遍历相同,相当于java中的for...each

    继承和Java相同是单继承

    二、第一个OC程序


    选择命令行程序

    选择语言位Objective-C,创建好的工程如下:

    //
    //  main.m
    //  firstOCProj
    //
    //  Created by lixiaoqiang on 14/11/11.
    //  Copyright (c) 2014年 lixiaoqiang. All rights reserved.
    //
    
    #import <Foundation/Foundation.h>
    
    int main(int argc, const char * argv[]) {
        @autoreleasepool {
            // insert code here...
            NSLog(@"Hello, World!");
        }
        return 0;
    }
    控制台输出:

    2014-11-11 23:44:36.052 firstOCProj[1649:99047] Hello, World!

    上面的@autoreleasepool和内存管理有关,暂时不用管。
    #import  <Foundation/Foundation.h> : import和include的作用一样,唯一区别是可以防止头文件被重复包含。
    NSLog():向控制台输出日志,相当于c语言中的printf(),和android中的Log

    三、类的基本语法

    OC中的类分为两个文件,一个是.h文件,另一个是.m文件(是OC文件的后缀名)
    .h : 类的声明文件,用于声明成员变量和方法。
    .m : 实现.h中声明的方法。
    新建Student.h和Student.m文件,工程如下:

    Student.h文件
    //
    //  Student.h
    //  firstOCProj
    //
    //  Created by lixiaoqiang on 14/11/11.
    //  Copyright (c) 2014年 lixiaoqiang. All rights reserved.
    //
    //该文件只是用来声明Student这个类有哪些成员变量和方法
    
    //包含NSObject所在的头文件
    #import <Foundation/Foundation.h>
    //@interface @end代表声明一个类
    //和Java不同的是OC中不能省略NSObject的默认继承
    // : 代表继承
    @interface Student : NSObject{
        //定义成员变量(必须定义在该括号内)
        int age;
    }
    
    //age的get方法
    //如果是动态方法 -
    //如果是静态方法 + (-和+必须添加)
    //OC中的参数类型都用括号括住
    //.h文件中的方法都是公共方法
    - (int)age;
    
    //age的set方法
    //OC中一个 : 对应一个参数
    - (void)setAge:(int)newAge;
    @end
    
    Student.m文件
    //
    //  Student.m
    //  firstOCProj
    //
    //  Created by lixiaoqiang on 14/11/11.
    //  Copyright (c) 2014年 lixiaoqiang. All rights reserved.
    //
    //自定义的头文件使用双引号
    #import "Student.h"
    
    @implementation Student
    
    - (int)getAge {
        return age; //age在父类中
    }
    
    - (void)setAge:(int)newAge {
        age = newAge;
    }
    
    @end
    
    main.m文件
    //
    //  main.m
    //  firstOCProj
    //
    //  Created by lixiaoqiang on 14/11/11.
    //  Copyright (c) 2014年 lixiaoqiang. All rights reserved.
    //
    
    #import <Foundation/Foundation.h>
    #import "Student.h"
    
    int main(int argc, const char * argv[]) {
        @autoreleasepool {
            
            //创建一个Student对象
            //1、调用一个静态方法alloc分配内存
            //OC 中通过类名调用方法 [类名 方法名]
            //[Student alloc]返回一个指针,在OC中stu称为对象
            //这个其实和Java中的对象(this)是一样的(引用)
            //Student *stu = [Student alloc];
            //2、调用一个动态方法init进行初始化
            //stu = [stu init];
            
            //连接起来使用
            Student *stu = [[Student alloc] init];
            [stu setAge:100];
            NSLog(@"调用了setAge方法");
            int age = [stu age];
            NSLog(@"Student的age是%i", age);
            //释放对象
            //[stu release];
        }
        return 0;
    }
    
    运行结果:

    2014-11-12 00:25:03.661 firstOCProj[1707:110472] 调用了setAge方法

    2014-11-12 00:25:03.663 firstOCProj[1707:110472] Studentage100


    四、点语法

    #import <Foundation/Foundation.h>
    
    @interface Person : NSObject{
        int _age;
        int _no;
    }
    
    - (void)setAge:(int)newAge;
    - (int)age;
    
    //注意: 方法名是setAge:andNo:
    - (void)setAge:(int)newAge AndNo:(int)no;
    
    @end
    #import "Person.h"
    
    @implementation Person
    
    //方法名是setAge:  (冒号也是方法名的一部分)
    - (void)setAge:(int)newAge {
        NSLog(@"调用了setAge方法:%i", newAge);
        _age = newAge;
    }
    
    //方法名是age
    - (int)age {
        NSLog(@"调用了age方法");
        return _age;
    }
    
    @end
    在Person类的实现里面我们分别打印了两个log用来判断是否调用了该方法
    #import <Foundation/Foundation.h>
    #import "Person.h"
    
    int main(int argc, const char * argv[]) {
        @autoreleasepool {
            Person *person = [[Person alloc] init];
            
            //方法一:
            //[person setAge:10];
            //int age = [person age];
            
            //方法二:(点语法)
            //OC中调用的成员方法,等效于[person age]
            person.age = 11;
            //等效于[person setAge:11]
            int age = person.age;
            
            NSLog(@"age is %i", age);
        }
        return 0;
    }
    输出结果:

    2014-11-12 20:03:55.718 firstOCProj[521:19414] 调用了setAge方法:11

    2014-11-12 20:03:55.719 firstOCProj[521:19414] 调用了age方法

    2014-11-12 20:03:55.720 firstOCProj[521:19414] age is 11


    可以看到在OC中的点语法和Java中是不一样的,person.age调用的是成员方法而不是变量。
    五、构造方法和%@
    //
    //  Person.m
    //  firstOCProj
    //
    //  Created by lixiaoqiang on 14/11/12.
    //  Copyright (c) 2014年 lixiaoqiang. All rights reserved.
    //
    
    #import "Person.h"
    
    @implementation Person
    
    - (void)setAge:(int)age {
        _age = age;
    }
    
    - (int)age {
        return _age;
    }
    
    - (void)setNo:(int)no {
        _no = no;
    }
    
    - (int)no {
        return _no;
    }
    
    //实现构造方法
    
    - (id)initWithAge:(int)age andNo:(int)no {
        //首先要调用super的构造方法
        if(self = [super init]){   //如果self不为nil
            self.age = age;
            self.no = no;
        }
        return self;
    }
    
    // 重写父类的description方法
    // 当使用%@打印一个对象的时候会调用
    // NSString 是一个字符串类
    - (NSString *)description {
        return [NSString stringWithFormat:@"age is %i and no is %i", _age, _no];
    }
    
    @end
    
    //
    //  main.m
    //  firstOCProj
    //
    //  Created by lixiaoqiang on 14/11/11.
    //  Copyright (c) 2014年 lixiaoqiang. All rights reserved.
    //
    
    #import <Foundation/Foundation.h>
    #import "Person.h"
    
    int main(int argc, const char * argv[]) {
        @autoreleasepool {
            Person *person = [[Person alloc] initWithAge:15 andNo:2];
            
            NSLog(@"age is %i and no is %i", person.age, person.no);
            
            //%@代表打印一个OC对象
            NSLog(@"%@", person);
        }
        return 0;
    }


  • 相关阅读:
    查看 lib 库信息
    评委打分(C++ 容器综合练习)
    二阶段12.16
    对搜狗输入法的使用心得
    二阶段12.14
    二阶段12.13
    二阶段12.12
    典型用户描述
    水王(课堂练习)
    一阶段11.21
  • 原文地址:https://www.cnblogs.com/lanzhi/p/6468766.html
Copyright © 2011-2022 走看看