代码之家  ›  专栏  ›  技术社区  ›  Tirth

在Objective-C中,何时应该使用类方法,何时应该使用实例方法?

  •  10
  • Tirth  · 技术社区  · 14 年前

    Objective-C中的类方法和实例方法有什么区别?我应该在什么时候使用它们?

    5 回复  |  直到 14 年前
        1
  •  12
  •   SmileBot    11 年前

    用破旧的汽车来比喻。。。

    把一个类想象成一个制造类实例的工厂。例如,您可能有一个Car类,并且可以声明如下方法:

    + carWithColor: (NSColor *) aColor;
    

    然后该方法将创建一个新的Car实例,设置颜色,并返回它:

     + carWithColor: (NSColor *) aColor
     {
         Car *aCar = [[[self alloc] init] autorelease];
         [aCar paintWithColor: aColor];
         return aCar;
     }
    

    - (void) paintWithColor: (NSColor *) aColor
    {
        ... do your paint stuff here ...
    }
    

    这一点在 Objects, Classes, and Messaging

        2
  •  8
  •   SmileBot    9 年前

    这是一个老帖子,但由于它首先出现在谷歌搜索,我想我应该添加到它。

    我不打算谈论用作工厂方法的类方法。我想谈谈它们在实用方法中的用法。对于独立于状态的实用程序方法,可以/应该使用类方法。这是什么意思?例如,如果对所有实例都使用相同的方式格式化日期,那么这是一个实用方法,应该是一个类方法。把实用方法想象成螺丝刀。你不需要每次你想用螺丝刀做点什么的时候都用它做一个新的实例。螺丝刀保持不变。例如,我有一个类,它包含一个私有方法,该方法生成一个emdash字符串,用于显示给视图。此方法不依赖于状态,因此不会因实例而异。想想像常量这样的类实用程序方法。

    + (NSString *)emDashString {
    return @"   \u2014 \u2014 \u2014 \u2014 \u2014 \u2014 \u2014 \u2014 \u2014";
    

    您可以在类中一般地调用此方法(在我的示例中是私有的),如下所示:

    NSString *string = [[self class] emDashString ];
    

    我特意选了一个小例子来说明这一点。如果要在类中多次使用此字符串,则只需将其设置为类实用程序方法。注意,我不是用名称来引用类,而是用[self class]来泛化它,因为它是在内部调用的。如果它是公开的,并且您想从另一个类调用它,那么像往常一样通过类名引用它。

        3
  •  0
  •   Alex Reynolds    14 年前

    方法处理

    NSString *myString;
    myString = [[[NSString alloc] initWithString:@"Hello, world."] autorelease];
    NSLog (@"myString's length: %u", [myString length]); // instance method
    

    等级 方法可以做什么 特定类别

    NSLog (@"%@", [NSString stringWithString:@"Hello, world."]); // class method
    

    我认为很少看到类方法不返回某些内容。

        4
  •  0
  •   mbmcavoy    14 年前

    您不需要同时实现这两个目标。在设计类时,任何一个选项都是可用的。

    // Notional instance methods
    myHouse.color = blueColor;
    
    [myCar accelerate];
    speed = myCar.speed;
    

    // Notional class method uses
    myString = [NSString stringWithFormat:@"&f", floatToConvert];
    
    myResult = [MyMathHelper MyFunctionWithInput:myInput];
    
        5
  •  -1
  •   anq    14 年前

    类方法签名的前缀为+,实例方法的前缀为-,因此在头文件中,声明如下所示:

    -(void)setAllThings:(NSArray*)things; //instance method
    +(void)setAllClassThings:(NSArray*)things; //class method
    

    当然,当您在.m文件中定义方法时,同样的规则也适用。