Objective

之前我们讲解了第一个OC类, 但还有一些更加细节的东西没有讲解, 下面让我们继续来看看吧~~~


#import <Foundation/Foundation.h>

@interface Preson : NSObject
{
    @public
    int age;
    double weight;
}

- (void)walk;
@end

@implementation Preson

- (void)walk
{
    NSLog(@"有一个%d岁的人在走路, 他的体重是%.2f/kg", age, weight);
}

@end

int main()
{
    Preson *p = [Preson new];
    p->age = 20;
    p->weight = 50.5;
    [p walk];
    
    Preson *p2 = [Preson new];
    p2->age = 30;
    p2->weight = 60.0;
    [p2 walk];
    
    return 0;
}


这里我们详细的分析一下, 看下面的示意图:






我们利用Proson这个类创建了两个对象, 虽然它们有相同的成员变量, 但它们却相互不受影响, 因为它们的地址是互不相同的, 而- (void)walk这个方法是它们所公用的一个方法, 谁去调用它, 那么输出的ageweight就是谁的.


如果我们改一下:

    Preson *p = [Preson new];
    p->age = 30;
    
    Preson *p2 = [Preson new];
    p2->weight = 55.5;
    
    [p walk];
    [p2 walk];

输出的结果是:

2015-01-13 16:12:16.495 a.out[6631:641703] 有一个30岁的人在走路, 他的体重是0.00/kg
2015-01-13 16:12:16.496 a.out[6631:641703] 有一个0岁的人在走路, 他的体重是55.50/kg


再改一下:

    Preson *p = [Preson new];
    p->age = 30;
    
    Preson *p2 = p;
    p2->weight = 55.5;
    
    [p walk];
    [p2 walk];

输出的结果是:

2015-01-13 16:13:25.043 a.out[6637:642493] 有一个30岁的人在走路, 他的体重是55.50/kg
2015-01-13 16:13:25.044 a.out[6637:642493] 有一个30岁的人在走路, 他的体重是55.50/kg



如果基础比较好的人肯定知道这是为什么, 不知道也没事, 我们下面来看看示意图:




看完示意图的人应该就知道了, 当p2存了p的地址时, 那么p2改了什么值, p也要跟着改, 因为它们的地址都是一样, 因为它们共用的一样的成员:

2015-01-13 16:19:44.991 a.out[6669:646229] 0x7f93c340e000  0x7f93c340e000


    Preson *p = [Preson new];
    p->age = 30;
    p->weight = 60.0;
    
    Preson *p2 = [Preson new];
    p2->age = 40;
    p2->weight = 55.5;

    p = p2;
    
    p->age = 20;
    [p walk];

这个例子也是如此.




好啦, 这次我们就讲到这里了, 下次我们继续~~~~

原文地址:https://www.cnblogs.com/iOSCain/p/4282863.html