Objective-C - 类方法与对象方法

类方法与对象方法


/*
 对象方法
 1> 减号 - 开头
 2> 只能由对象来调用
 3> 对象方法中能访问当前对象的成员变量(实例变量)

 类方法
 1> 加号 + 开头
 2> 只能由类(名)来调用
 3> 类方法中不能访问成员变量(实例变量)


 类方法的好处和使用场合
 1> 不依赖于对象,执行效率高
 2> 能用类方法,尽量用类方法
 3> 场合:当方法内部不需要使用到成员变量时,就可以改为类方法

 可以允许类方法和对象方法同名
 */


@interface Person : NSObject
{
    int age;
}

// 类方法都是以+开头
+ (void)printClassName;

- (void)test;
+ (void)test;

@end

@implementation Person

+ (void)printClassName
{
    // error:instance variable 'age' accessed in class method
    // 实例变量age不能在类方法中访问
    //NSLog(@"这个类叫做Person-%d", age);
}

- (void)test
{
    NSLog(@"111-%d", age);

    //[Person test];
}

+ (void)test
{
    // 会引发死循环
    //[Person test];

    NSLog(@"333");

    // 会引发死循环
//    /[Person test];
}

@end

int main()
{
    //[Person printClassName];

    [Person test];

    //Person *p = [Person new];
    //[p test];

    /*
     -[Person printClassName]: unrecognized selector sent to instance 0x7fa520c0b370
     */
    // 系统会认为现在调用的printClassName是个对象方法
    //[p printClassName];

    return 0;
}

类方法封装工具类


/*
 设计一个计算器类
 * 求和
 * 求平均值
 */

#import 

// 工具类:基本没有任何成员变量,里面的方法基本都是类方法
@interface JiSusnQi : NSObject
+ (int)sumOfNum1:(int)num1 andNum2:(int)num2;

+ (int)averageOfNum1:(int)num1 andNum2:(int)num2;
@end

@implementation JiSusnQi
+ (int)sumOfNum1:(int)num1 andNum2:(int)num2
{
    return num1 + num2;
}

+ (int)averageOfNum1:(int)num1 andNum2:(int)num2
{
    int sum = [JiSusnQi sumOfNum1:num1 andNum2:num2];
    return sum / 2;
}
@end

int main()
{
    int a = [JiSusnQi averageOfNum1:10 andNum2:12];

    NSLog(@"a=%d", a);

//    JiSusnQi *jsq = [JiSusnQi new];
//    
//    
//    [jsq sumOfNum1:10 andNum2:13];

    return 0;
}

OC弱语法


// 尽管编译器容错能力比较,但是写代码必须规范
@interface Person : NSObject
- (void)test;
@end

@implementation Person
- (void)test
{
    NSLog(@"哈哈哈");
}
@end

// 一旦运行过程中出错,就会闪退

/*
 -[Person test]: unrecognized selector sent to instance 0x7fd2ea4097c0
 给Person对象发送了一个不能识别的消息:test
 */

int main()
{
    Person *p = [Person new];
    // OC是在运行过程中才会检测对象有没有实现相应的方法
    [p test];
    return 0;
}

你可能感兴趣的:(深入Objective-C)