What is the difference between class and instance methods?

后端 未结 18 2156
说谎
说谎 2020-11-21 11:55

What\'s the difference between a class method and an instance method?

Are instance methods the accessors (getters and setters) while class methods are pretty much ev

相关标签:
18条回答
  • 2020-11-21 12:52

    Instances methods operate on instances of classes (ie, "objects"). Class methods are associated with classes (most languages use the keyword static for these guys).

    0 讨论(0)
  • 2020-11-21 12:55

    Note: This is only in pseudo code format

    Class method

    Almost does all it needs to do is during compile time. It doesn't need any user input, nor the computation of it is based on an instance. Everything about it is based on the class/blueprint——which is unique ie you don't have multiple blueprints for one class. Can you have different variations during compile time? No, therefore the class is unique and so no matter how many times you call a class method the pointer pointing to it would be the same.

    PlanetOfLiving: return @"Earth" // No matter how many times you run this method...nothing changes.
    

    Instance Method

    On the contrary instance method happens during runtime, since it is only then that you have created an instance of something which could vary upon every instantiation.

    initWithName: @"John" lastName: @"Doe"Age:12 @"cool"
    initWithName: @"Donald" lastName: @"Drumpf"Age:5 attitude:@"He started"
    initWithName: @"President" lastName: @"Obama"Age:54 attitude: @"Awesome"
    //As you can see the value can change for each instance.
    

    If you are coming from other languages Static methods are same as class methods.
    If you are coming from Swift, type methods are same as class methods.

    0 讨论(0)
  • 2020-11-21 12:56

    Like the other answers have said, instance methods operate on an object and has access to its instance variables, while a class method operates on a class as a whole and has no access to a particular instance's variables (unless you pass the instance in as a parameter).

    A good example of an class method is a counter-type method, which returns the total number of instances of a class. Class methods start with a +, while instance ones start with an -. For example:

    static int numberOfPeople = 0;
    
    @interface MNPerson : NSObject {
         int age;  //instance variable
    }
    
    + (int)population; //class method. Returns how many people have been made.
    - (id)init; //instance. Constructs object, increments numberOfPeople by one.
    - (int)age; //instance. returns the person age
    @end
    
    @implementation MNPerson
    - (id)init{
        if (self = [super init]){
              numberOfPeople++;
              age = 0;
        }    
        return self;
    }
    
    + (int)population{ 
         return numberOfPeople;
    }
    
    - (int)age{
         return age;
    }
    
    @end
    

    main.m:

    MNPerson *micmoo = [[MNPerson alloc] init];
    MNPerson *jon = [[MNPerson alloc] init];
    NSLog(@"Age: %d",[micmoo age]);
    NSLog(@"%Number Of people: %d",[MNPerson population]);
    

    Output: Age: 0 Number Of people: 2

    Another example is if you have a method that you want the user to be able to call, sometimes its good to make that a class method. For example, if you have a class called MathFunctions, you can do this:

    + (int)square:(int)num{ 
          return num * num;
    }
    

    So then the user would call:

    [MathFunctions square:34];
    

    without ever having to instantiate the class!

    You can also use class functions for returning autoreleased objects, like NSArray's

    + (NSArray *)arrayWithObject:(id)object
    

    That takes an object, puts it in an array, and returns an autoreleased version of the array that doesn't have to be memory managed, great for temperorary arrays and what not.

    I hope you now understand when and/or why you should use class methods!!

    0 讨论(0)
  • 2020-11-21 12:57

    I think the best way to understand this is to look at alloc and init. It was this explanation that allowed me to understand the differences.

    Class Method

    A class method is applied to the class as a whole. If you check the alloc method, that's a class method denoted by the + before the method declaration. It's a class method because it is applied to the class to make a specific instance of that class.

    Instance Method

    You use an instance method to modify a specific instance of a class that is unique to that instance, rather than to the class as a whole. init for example (denoted with a - before the method declaration), is an instance method because you are normally modifying the properties of that class after it has been created with alloc.

    Example

    NSString *myString = [NSString alloc];
    

    You are calling the class method alloc in order to generate an instance of that class. Notice how the receiver of the message is a class.

    [myString initWithFormat:@"Hope this answer helps someone"];
    

    You are modifying the instance of NSString called myString by setting some properties on that instance. Notice how the receiver of the message is an instance (object of class NSString).

    0 讨论(0)
  • 2020-11-21 12:59

    The answer to your question is not specific to objective-c, however in different languages, Class methods may be called static methods.

    The difference between class methods and instance methods are

    Class methods

    • Operate on Class variables (they can not access instance variables)
    • Do not require an object to be instantiated to be applied
    • Sometimes can be a code smell (some people who are new to OOP use as a crutch to do Structured Programming in an OO enviroment)

    Instance methods

    • Operate on instances variables and class variables
    • Must have an instanciated object to operate on
    0 讨论(0)
  • 2020-11-21 12:59

    class methods

    are methods which are declared as static. The method can be called without creating an instance of the class. Class methods can only operate on class members and not on instance members as class methods are unaware of instance members. Instance methods of the class can also not be called from within a class method unless they are being called on an instance of that class.

    Instance methods

    on the other hand require an instance of the class to exist before they can be called, so an instance of a class needs to be created by using the new keyword. Instance methods operate on specific instances of classes. Instance methods are not declared as static.

    0 讨论(0)
提交回复
热议问题