C:-/+和*var

Objective-C Clarification; -/+ and *var

我正在从一本书(MacOSX的Cocoa编程)中教自己Objective-C,大约已经完成了一半,但是我有两个问题没有在书中回答或定义。

  • 定义类方法时,两者之间的区别是什么(假设在.h文件中):

    -(int)人口;

    +(int)人口;

  • 我现在看到的是,-方法要求首先分配和初始化类,但是可以静态调用+而不需要分配和初始化。例如(在另一类函数中)

    1
    2
    3
    4
    5
    6
    // Using -
    Earth *world = [[Earth alloc] init];
    int population = [world population];

    // Using +
    int population = [Earth population];

    如果这是正确的,我应该在什么时候使用静态方法,它们是否是这样做的任何缺点。

  • 当在一个函数参数中定义一个var,或者在一个函数中定义一个实际的var时,使用*表示var将是一个对象吗?例如(同样在头文件中)。

    -(void)setpopulation:(nsnumber*)population;//使用*作为population是nsnumber

    -(void)setpopulation:(int)population;//population不是类,因此不需要*

  • 抱歉,如果我的任何术语在Objective-C领域(如静态方法等)没有意义,我是一个PHP和Ruby程序员。


    Objective-C方法声明中的-/+只表示该方法是类方法还是实例方法。例如,对于Objective-C,不能向实例发送声明为类方法的消息。例如:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    @interface MyObject : NSObject
    -(void)myInstanceMethod;
    +(void)myClassMethod;
    @end

    // ...

    MyObject* obj = [[MyObject alloc] init];

    [obj myInstanceMethod];      // this is okay
    [obj myClassMethod];         // this will fail
    [[obj class] myClassMethod]; // this is okay
    [MyObject myClassMethod];    // this is okay
    [MyObject myInstanceMethod]; // this will fail

    关于问题的第二部分,objective-c是C的一个严格的超集。它添加类,但它们实际上是C数据结构,其实现被objective-c运行时隐藏。因此,类总是表示为指针。在C语言中,*表示变量被声明为指向某个内存地址的指针。也可以在C中使用带有基元类型的指针,但Objective-C对象必须始终由指针引用。

    有很多很好的教程/介绍指向那里。我建议简单的谷歌C教程和指针学习更多。


    +声明是一个类方法,不需要实例来调用它。构造函数/工厂方法必须是类方法。-在单个实例上声明了实例方法和操作。每个实例都有自己的独立状态(成员变量)。这是OO编程的基本区别!通常,使大多数方法成为实例方法,实用程序类除外。


    您可以看到一些关于何时使用静态方法的讨论,我应该在何时编写静态方法?