天天看点

Objective-C 读书笔记(二)类对象

文章目录

  • 对象

对象和类

面向对象的程序设计过程中有两个重要概念:类(class)和对象(object,也可称为实例,instance),其中类是某一批对象的抽象,可以把类理解成某种概念;对象才是一个具体存在的实体,从这个意义上看,我们日常所说的人其实都是人的实例,而不是人类

类是面向对象的重要内容,我们可以把类当成一种自定义数据类型,可以使用类来定义变量,这种类型的变量相当于指针类型的变量。也就是说,所有的类都是指针类型的变量。

定义类

Objective-C中定义类需要分为两个步骤。

1. 接口部分:定义该类包含的成员变量和方法

  a. 用 @interface声明定义的接口部分,@end表明定义结束。

  b. 接口部分的源代码应该命名为 .h文件

#import <Foundation/Foundation.h>
 
@interface Person : NSObject
{
    //定义成员变量
    NSString* _name;
    int _age;
}
 
//定义一个setName: andAge:方法
-(void) setName:(NSString*) name andAge:(int) age;
 
//下面定义一个say方法,并不提供实现
-(void) say:(NSString *) content;
 
//下面定义一个不带形参数的方法
-(NSString*) info;
 
//定义一个类方法
+(void) foo;
 
@end

           

  其中紧跟该类的一对花括号用于声明该类的成员变量;花括号后面的部分用于声明该类的方法

2. 实现部分:为该类的方法提供实现

  实现部分的源代码应该命名为 *.m文件

#import "Person.h"
 
@implementation Person
{
    //定义来一个只能在实现部分使用的成员变量(被隐藏的成员变量)
    int _testAttr;
}
 
//实现一个setName: andAge: 方法
-(void) setName:(NSString *)name andAge:(int)age
{
    _name = name;
    _age = age;
}
 
//下面实现了一个say方法
-(void) say:(NSString *)content
{
    NSLog(@"%@",content);
}
 
//下面实现了不带形参的info方法
-(NSString*) info
{
    [self test];    //self是调用该方法的对象
    return [NSString stringWithFormat:@"姓名:%@,  年龄%d",_name,_age];
}
 
//定义一个只能在实现部分使用的方法(被隐藏的方法)
-(void) test
{
    NSLog(@"--只能在实现部分使用的方法----");
}
 
//实现了一个类方法
+(void) foo
{
    NSLog(@"类的方法,通过类名调用,类似Java");
}
 
@end

           

关于类的实现

  1. 实现部分必须为接口部分的所有方法提供实现。除此之外,实现部分也可定义隐藏的成员变量和方法。
  2. 类实现部分的类名必须与类接口部分的类名相同,用于表示这是同一个类的接口部分和实现部分
  3. 类实现部分也可以在类名后面使用 “:父类” 来表示集成了某个父类,但一般没有必要,因此,通常都不会这么做
  4. 类实现部分也可声明自己的成员变量,但这些成员变量只能在当前类内访问。因此,再类实现部分声明成员变量相当于定义隐藏的成员变量

图示:

Objective-C 读书笔记(二)类对象

对象

在前面定义类之后,接下来就可以使用该类了,可从如下 3 方面来使用类

  1. 定义变量:

    类名 * 变量名

  2. 创建对象:

    [[ 类名 alloc ] 初始化方法]

  3. 调用类方法:

    [调用者 方法名:参数 形参标签:参数值 ...

在上面的语法中,alloc是Objective-C的关键字,该关键字负责为该类分配内存空间、创建对象。除此之外,还需要调用初始化方法对该实例执行初始化。由于所有的对象都继承了NSObject类,因此所有的类都有一个默认的初始化方法:init

注: Objective-C规定:实例方法(以-声明的方法)必须用实例来调用;二类方法(以+声明的方法)则必须使用类调用——这也符合现实规则:每个人的方法,都只能由于他自己调用

#import <Foundation/Foundation.h>
#import "Person.h"      //导入类的接口部分即可
 
int main(int argc, const char * argv[]) {
    @autoreleasepool {
        
        //定义Person* 类型的变量
        Person* person;
        
        //创建Person对象,赋值给person变量赋值
        person = [[Person alloc] init];
        
        //OC允许直接通过对象来访问成员变量,不过有权限的设置(对象->成员变量名)
        
        //调用有参数的方法,必须传入参数;
        [person say:@"我必须学好OC"];
        [person setName:@"HUXU" andAge:25];
        
        //调用无参数的方法,不需要传入参数
        //方法有返回值,可以定义一个类型匹配的变量,来接受返回值
        NSString* info = [person info];
        NSLog(@"person的info是:%@",info);
        
        //调用test方法是不行滴,[person test];因为test方法是在实现部分定义的
        
        //通过类名直接调用方法
        [Person foo];
    }
    return 0;


           

总结: 这周主要学习了类和对象的定义和使用,跟着书学着打代码,从这一章开始就和之前学的完全不一样了,还要继续练习消化新的概念。

继续阅读