黑马程序员——ObjC基础—方法

-----------Java培训Android培训IOS培训.Net培训、期待与您交流!------------ 

本节讨论OC中类方法和对象方法的创建和使用。

什么是类方法,什么是对象方法呢?简单来讲,类方法是直接通过类访问的方法,对象方法是通过对象来访问的方法。

1、类方法和对象方法的创建

类方法通过在方法前面加 “+” 符号创建,对象方法通过在方法前面加 “-”创建。如下所示:

@interface Dog : NSObject
{
    @public
    NSString *name;  // 对外的属性
}

+ (void)descriptionAboutDogClass; // 类方法
- (void)bark; // 对象方法

@end

@implementation Dog
// 类方法实现
+ (void)descriptionAboutDogClass{
    NSLog(@"This is a Dog class");
}
// 对象方法实现
- (void)bark{
    NSLog(@"Wowow!(I am %@)", name);
}
@end
我们来看看这两种方法的调用有什么区别:

    [Dog descriptionAboutDogClass]; // 类方法可以通过类名直接调用
    
    Dog *d=[Dog new];  // 创建对象
    d->name=@"Wangcai";  // 对象初始化
    
    [d bark]; // 对象方法通过对象才能调用
我们可以看出,这两者的主要区别就在于是谁在调用这个方法:

类方法:通过类来调用

对象方法:通过对象来调用


2、为什么要有类方法和对象方法?
①  我们知道,类和对象是存在不同的存储区间的,一个在静态区,一个在堆内,方法是存放在静态区的,类的方法可以直接访问,对象的方法则要通过 isa 来间接访问。这就必然导致两种方法的存在;

②  为什么要使用类方法?在实际的使用中有的方法必须通过类方法来实现,比如对象的创建本身也是一个方法(alloc存储分配),调用这个方法的时候,对象还没创建出来;有的方法则不需要创建对象,比如我们创建一个数学函数库,内部不设计个性化的属性,这自然也就不需要创建对象来浪分空间,这样也就需要用到类方法。举例如下:

@interface Math : NSObject
+ (double)get_pi;  // 返回pi值
+ (double)sumA:(double)a andB:(double)b; // 计算两数的和
@end

@implementation Math
+ (double)get_pi{
    return 3.1415926;
}
+ (double)sumA:(double)a andB:(double)b{
    return a + b;
}
@end
当然实际上不会写这么简单的函数,有更复杂的应用。


3、类方法细节

由于类方法是在对象创建之前使用的,因此对象的属性是不能直接内部访问的。也就是说,不在内部直接调用对象属性的方法,我们可以(注意是可以,不是必须)定义成类方法。

类方法的创建格式如下:

+ (返回值类型)含参数A的类方法名:(参数A类型)参数A    参数B名称:(参数B类型)参数B ... { 代码 }

+ (double)sumA:(double)a andB:(double)b{ // 注意这里的参数是从外部访问的
    return a + b;
}
返回值可以是void,参数名称可以省略(冒号不可),但是不建议这样做,这些用于标识方法的名称(包括冒号)合在一起,构成完整的方法名(上面一行代码的方法名为:sumA:andB)。方法名的定义要尽量规范、通俗易懂。

4、对象方法细节
对象方法的创建比较自由,可以直接调用对象属性,当然,不调用对象属性也是可以的。能用类方法创建的方法,用对象方法也能创建,创建方法与类方法类似。

- (返回值类型)含参数A的类方法名:(参数A类型)参数A    参数B名称:(参数B类型)参数B ... { 代码 }

- (void)selfIntroduceWithString:(NSString*)string{
    NSLog(@"My name is %@, and %@",
          self->name,  // 直接调用属性
          string); // 调用参数,注意参数和属性不是一个概念
}

5、引出一个疑问

对象创建的alloc方法没有接收任何参数,他怎么能在不知道属性参数的情况下,为属性分配空间呢?他显然要了解要创建的各个属性的特点!但是这些属性的特点他是从静态代码区读取到的,这和直接读取属性的值是两个概念。



-----------Java培训Android培训IOS培训.Net培训、期待与您交流!------------ 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值