zoukankan      html  css  js  c++  java
  • ObjectiveC 学习笔记(二) 类声明,定义,实例,初始化

    Objective-C中,调用方法被称为发送消息 ,通知对象执行某种操作。语法如下:[shape draw]

    一、类声明(接口):

    @interface TestCoop : NSObject {
        int iMonth;
        int iYear;
        int iDay;
    }

    - (void) setYear: (int) iYear;
    - (void) primalSetData: (int)iYear :(int)iMonth :(int)iDay;
    - (void) setData: (int)Year iMonth:(int)iMonth iDay:(int)iDay;
    - (void) displayDateInfo;

    @end

    1、前面的短线/- 表示这是Objective-C方法的声明,用来区分函数原型(C语言中)与(Objective—C中)方法声明的方式。短线后面是方法的返回类型/比如( void) ,位于圆括号中。

    1.1 注意,方法的声明在括号后面,@end之前 {}区域里只有变量的定义,这点和C++很不一样。

    2、返回类型后面自然是函数名字,和C语言一样的,不同的是参数声明方法

    2.1、无参数的函数后面不需要加括号和冒号,直接是函数名结束加分号,比如: - (void) displayDateInfo;

    2.2、有参数的后面加冒号和参数类型名字,比如:

    - (void) setDay: (int) iDay; //单个参数
    - (void) primalSetData: (int)iYear :(int)iMonth :(int)iDay;//多个参数

    objective还提供一种中缀符的语法,方法的名称和参数都是和在一起的:

    参数前面多加一个标识符,通常和变量名一样,如下:

    - (void) setData: (int)Year iMonth:(int)iMonth iDay:(int)iDay;//多个参数

    苹果推荐使用第二种方法,虽然繁琐点。

    二、类实现:

    @implementation TestCoop
    - (void) displayDateInfo{
        NSLog(@"Today is: %d.%d.%d/n", iYear, iMonth, iDay);
    }

    - (void) setYear: (int) year{
        iYear = year;
    }

    - (void) primalSetData: (int)year :(int)month :(int)day{
        iYear = year;
        iMonth = month;
        iDay = day;   
    }

    - (void) setData: (int)year iMonth:(int)month iDay:(int)day{
        iYear = year;
        iMonth = month;
        iDay = day;
    }

    1、注意:类的方法实现部分函数参数不能和声明部分一样,就是不能和类变量同名,否则会隐藏初始变量。

    比如:- (void) setYear: (int) year{ //right
        iYear = year;
    }

    改成和声明时一样的话,如下:- (void) setYear: (int) iYear{ //error
        iYear = iYear;
    }

    明显出问题了,xcode编译会报warnging,就是初始变量被隐藏,其实本质就是变量作用域的问题,你局部变量和类变量名字一样,

    当然访问不到了。

    根由:声明的时候Objective-C喜欢用类变量的名字来代替函数参数名,不知道为啥,真是个纠结的问题。(要是从声明的时候就不用,就OK了,也不用到定义时再去改,不知道苹果那样做的理由)。

    三、实例化对象

    int main (int argc, const char * argv[]) {
        NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];

        // insert code here...
        //NSLog(@"%d-,%s %@/n", 12, "hel123lo", @"123");
       
        TestCoop *ptest = [TestCoop new];
        [ptest primalSetData :2009 :03 :05];
        [ptest displayDateInfo];
        [ptest setData:2010 iMonth:06 iDay:06];
        [ptest displayDateInfo];
        [ptest setYear:1987];
        [ptest displayDateInfo];
        [pool drain];
        return 0;
    }

    运行后会输出如下信息:

    Today is: 2009.3.5

    Today is: 2010.6.6

    Today is: 1987.6.6

    通过向需要创建对象的类发送new消息,可以创建各个对象。

    然后向对象发送各种消息来操作对象。

    //类的初始化

    不过,cocoa习惯使用alloc和init来创建对象,而不是new

    使用alloc来分配内存,并使用init来初始化,会将这块内存全部清0,bool型为NO,int型为0,指针为nil

    上面的创建对象代码改成如下:

    TestCoop *ptest = [[TestCoop alloc] init];

  • 相关阅读:
    Checking Types Against the Real World in TypeScript
    nexus pip proxy config
    go.rice 强大灵活的golang 静态资源嵌入包
    几个golang 静态资源嵌入包
    rpm 子包创建学习
    Rpm Creating Subpackages
    ava 类似jest snapshot 功能试用
    ava js 测试框架基本试用
    The Architectural Principles Behind Vrbo’s GraphQL Implementation
    graphql-compose graphql schema 生成工具集
  • 原文地址:https://www.cnblogs.com/secbook/p/2655425.html
Copyright © 2011-2022 走看看