• 第一个OC的类


    一、语法简介:
      1.类:
        在Java中,我们用1个.java文件就可以描述清楚一个类;在OC中,一般用2个文件来描述一个类:
          1> .h:类的声明文件,用于声明成员变量、方法。类的声明使用关键字@interface和@end。
            注意:.h中的方法只是做一个声明,并不对方法进行实现。
            也就是说,只是说明一下方法名、方法的返回值类型、方法接收的参数类型而已,并不会编写方法内部的代码。
          2> .m:类的实现文件,用于实现.h中声明的方法。类的实现使用关键字@implementation和@end。
      2.方法:
        1> 方法的声明和实现,都必须以 + 或者 - 开头
          1.+ 表示类方法 (静态方法)
          2.- 表示对象方法 (动态方法)
        2> 在.h中声明的所有方法作用域都是public类型,不能更改
      3.成员变量:
        成员变量的常用作用域有3种:
          1> @public 全局都可以访问
          2> @protected 只能在类内部和子类中访问
          3> @private 只能在类内部访问
        比Java少了一种作用域:包权限作用域,原因很明显:OC没有包名的概念。

      设置成员变量的作用域:
        1 #import <Foundation/Foundation.h>
        2
        3 @interface Student : NSObject {
        4 int age; // 年龄
        5
        6 @public
        7 int no; // 学号
        8 int score; // 成绩
        9
        10 @protected
        11 float height; // 身高
        12
        13 @private
        14 float weight; // 体重
        15 }
        16
        17 @end

      1.在Student.h中声明方法:
        1 #import <Foundation/Foundation.h>
        2 //这里的":"为实现的意思;字段必须写在{}内部。
        3 @interface Student : NSObject {
        4 int age; // 年龄
        5
        6 @public
        7 int no; // 学号
        8 int score; // 成绩
        9
        10 @protected
        11 float height; // 身高
        12
        13 @private
        14 float weight; // 体重
        15 }
        16
        17 // age的get方法,返回值为int类型的。
        18 - (int)age;
        19
        20 // age的set方法,无返回值;一个冒号:对应一个参数。
        21 - (void)setAge:(int)newAge;
        22
        23 @end

        再加大一下难度,假如增加一个方法可以同时设置age和height,那么就应该这样写:
          1 - (void)setAge:(int)newAge andHeight:(float)newHeight;
            * 这个方法是动态方法、没有返回值,接收2个参数,所以有2个冒号:
            * 这个方法的方法名是setAge:andHeight:
            * 其实andHeight是可以省略的,它只是为了让方法名念起来通顺一点,也让(float)newHeight前面的冒号:不那么孤单。

      2.在Student.m中实现方法:
        前面已经在Student.h中声明了3个方法,接下来一一实现它们:
        1 #import "Student.h"
        2
        3 @implementation Student
        4
        5 // age的get方法
        6 - (int)age {
        7 // 直接返回成员变量age
        8 return age;
        9 }
        10
        11 // age的set方法
        12 - (void)setAge:(int)newAge {
        13 // 将参数newAge赋值给成员变量age
        14 age = newAge;
        15 }
        16
        17 // 同时设置age和height
        18 - (void)setAge:(int)newAge andHeight:(float)newHeight {
        19 age = newAge;
        20 height = newHeight;
        21 }
        22 @end

    二、创建对象:
      1 #import <Foundation/Foundation.h>
      2 #import "Student.h"
      3
      4 int main(int argc, const char * argv[])
      5 {
        //与内存管理有关。
      6 @autoreleasepool {
        //alloc:分配存储空间;init:初始化对象。
      7 Student *stu = [[Student alloc] init];
      8
        //释放内存
      9 [stu release];
      10 }
      11 return 0;
      12 }

      alloc方法是这样声明的:
        + (id)alloc;
      可以看到,它的返回值类型是id,这个id代表任何指针类型,你可以暂时理解为:id可以代表任何OC对象,类似于NSObject *。

    三、销毁对象:
      由于OC不支持垃圾回收,因此当不再使用某个对象时,需要调用对象的release方法释放此对象。
        [stu release];


    四、其他:
      1> 也可以调用静态方法new快速创建一个对象
          1 Student *stu = [Student new];
          2
          3 [stu release];
        不过我们还是习惯使用alloc和init来创建对象
      2> 前面我们调用了Student的alloc、init、new方法,但是你会发现Student.h中并没有声明这些方法,为什么能够调用呢?
    原因很简单,这些方法都是父类NSObject的,子类当然可以调用父类的方法。


    五、访问公共成员变量和方法:
      1 #import <Foundation/Foundation.h>
      2 #import "Student.h"
      3
      4 int main(int argc, const char * argv[])
      5 {
      6 @autoreleasepool {
      7 Student *stu = [[Student alloc] init];
      8
      9 // 访问公共变量no
      10 stu->no = 10;
      11
      12 // 调用setAge:方法设置变量age的值
      13 [stu setAge:27];
      14
      15 // 调用setAge:andHeight:方法同时设置变量age和height的值
      16 [stu setAge:28 andHeight:1.88f];
      17
      18 // 访问公共变量no
      19 int no = stu->no;
      20 // 调用age方法获取变量age的值
      21 int age = [stu age];
      22
      23 // 打印no和age的值
      24 NSLog(@"no is %i and age is %i", no, age);
      25
      26 [stu release];
      27 }
      28 return 0;
      29 }


        1.第7行创建了Student对象,第26行销毁了对象
        2.第10行和第19行访问了Student对象的公共成员变量no,如果不是公共变量,不能像这样直接访问。注意访问方式:对象->成员变量
        3.第13行调用了Student对象的setAge:方法,传入参数27修改了成员变量age的值
        4.第16行调用了Student对象的setAge:andHeight:方法,同时修改了成员变量age和height的值
        5.第21行调用了Student对象的age方法获取成员变量age的值
        6.第24行输出了age和no的值,输出结果:
          2013-04-06 21:54:56.221 第一个OC程序[1276:303] no is 10 and age is 28

  • 相关阅读:
    java基础之多线程一:概述
    java基础之io流总结四:字符流读写
    java基础之io流总结三:字节流读写
    java基础之io流总结二:File类基本应用
    java基础之io流总结一:io流概述
    java基础之集合:List Set Map的概述以及使用场景
    java基础之集合长度可变的实现原理
    HDU 4770 Lights Against Dudely 暴力枚举+dfs
    HDU 4771 BFS + 状压
    Codeforces Round #269 (Div. 2) D
  • 原文地址:https://www.cnblogs.com/tzktzk1/p/3329599.html
Copyright © 2020-2023  润新知