[OC]-类和对象和方法详解

OC-类和对象

定义类

面向对象程序设计中有两个重要概念,类(class)和对象(object),对象也称为实例。
类和对象是面向对象的核心

定义类的步骤:

在这里插入图片描述

接口部分就是对成员变量进行定义,而实现部分就是对整个接口部分进行一个想细化的说明,下面我们会提到

类型 :可以是oc允许的任何类型,包括基本类型,构造类型和各种指针类型类型;

成员变量名 :OC语言建议成员变量名以下环线开头 int _data

语法声明格式

在这里插入图片描述

关于 方法类型标识
+ :代表是类方法,直接使用类名即可调用
—:代表实例方法 必须用对象才能调用
eg :// 下面定义了一个 写名字和年龄的方法,void是无返回值的 ,
- (void) setName: (NSString*) name andAge :(int) age;
 setName 是一个传入参数为NSString的方法,参数的名字是name,
 andAge 同理 传入的int 类型赋值 age

注意 setName 与 setName :是两种不同的方法
前者不带冒号说明是一个不带形参的方法
后者这是一个带有形参的方法

类的实现

在这里插入图片描述

实现部分语法

关于实现部分的语法说明

  • 类实现部分的类名必须与类接口部分的类名相同, 用于表示这是同一个类的接口部分和实现部分
  • 类实现不部分也可以声明自己的变量,但是这和语言的函数一样 只能在当前类内访问西安挡雨 定义属于自己的隐藏成员变量

代码展示

对象的产生与使用

  • 定义变量
  • 创建对象
  • 实现类方法
// 接口部分
//1.定义一个疯狂person的类
@interface FKperson : NSObject {
    定义了2个成员变量
    int _age;
    NSString* _name;
@public;
}

// 2.方法声明
//“- ”是实例方法 必须由实例来调用

// 下面定义了一个 写名字和年龄的方法,void是无返回值的 ,
- (void) setName: (NSString*) name andAge :(int) age;

// 下面定义了一个say方法 ,参数传入的是NSString* 型的
- (void) say: (NSString*) content;

// 不带形参的方法  注意 返回值是(NSString* 型)
- (NSString*) info;

//“+”是类方法,只能使用类来调用
+ (void) foo;
@end



//3.方法实现

@implementation FKperson {
    ;
}

// 这个test没有在接口中声明,所以只能在实现部分使用-(被隐藏的方法)
- (void) test {
    NSLog(@"--只在实现部分定义的tset方法\n");
}

// name 被 n代替 age 被 a代替,之后有解释说明
- (void) setName: (NSString *)n andAge: (int)a {
    _name = n;
    _age = a;
}

// 定义了一个say方法
- (void) say:(NSString *) content {
    NSLog(@"%@", content);
}

// 定义了一个不带形参但是有返回值的方法
- (NSString*) info {
    [self test];//
    return [NSString stringWithFormat:
            @"我是一个NBA球员名字为: %@, 年龄为%d。", _name, _age];
}

//定义了一个只能被类调用的类方法
+ (void) foo {
    NSLog(@"FKperson 类的泪方法, 只通过类名进行调用");
}
@end

//对象的产生和使用
int main(int argc, const char * argv[]) {
    @autoreleasepool {
        FKperson * person = [[FKperson alloc] init];
        [person say:@"Hello, I love iOS "];
        [person setName:@"獭兔" andAge:27];
        NSString* info = [person info];
        NSLog(@"person -info 的信息为:%@", info);
        [FKperson foo];
        
    }
    return 0;
}

在这里插入图片描述

** 值得注意的是 在实例方法info中 出现了[self ] 这个新名词**

在上面程序中,通过 FKPerson 实例调用了 say:万法,调用方法吋必须为方法的形参赋值。
因此,在这行代码中调用 FKPerson 对象的 say:方法时,必须为 say:方法传入一个字符串作为
形参的参数值,这个字符串将被赋给 content 参数
除此之外,上面程序还调用了 FKPerson 对象的 setName:andAge::万法和 info 方法:对于
test 方法,由于程序只是在 FKPerson 类的实现部分定义了该万法,故该 test 方法仅能在
FKPerson 类的内部使用,因此程序通过 FKPerson 对象不能调用 test 方法。
H面程序通过 FKPerson 类调用了foo 万法,这是因为定叉foo 方法时使用了+标识符,表
明该方法是一个类方法,因此只能通过 FKPerson 类调用

self关键字

定义

  • **Objective-C 提供了一个self 关键字,self 关键字总是指向该方法的调用者(对象或类),当 self 出现在实例方法中时,self 代表调用该方法的对象:当self 出现在类方法中时,self 代表调用该方法的类。
    self 关键字最大的作用是让类中的一个方法访问该类的另一个方法或成员变量。先看下面这个例子,假设定义了一个FKDog 类,这个FKDog对象的run 方法需要调用它的jump 方法,

    self 总是代表当前方法的调用者,当这个方法被调用时,它所代表的对象才被确定下来:
    谁在调用该方法,self 就代表谁。**

// self关键字
// 接口部分
@interface fkdog : NSObject {
    ;
}
- (void) jump;
- (void) run;
@end

// 实现部分
@implementation fkdog

-(void) jump {
    NSLog(@"正在执行jump方法");
}

-(void) run {
    [self jump];
    NSLog(@"正在执行run方法");
}
@end

** 如果self出现在实例方法中,self就代表调用该方法的对象
当self出现在类方法中,self就代表调用该方法类本身
**

self案例

  • 当self作为作为对象的默认引用使用时,程序可以像访问普通变量一样访问self这个引用,也可以吧self当作普通方法的返回值
@interface returnSelf : NSObject {
    @public
    int _age;
}
- (returnSelf*) grow;

@end

@implementation returnSelf
- (returnSelf *) grow {
    _age ++;
    return self;
}
@end
int main(int argc, const char * argv[]) {
    @autoreleasepool {
//        FKperson * person = [[FKperson alloc] init];
//        [person say:@"Hello, I love iOS "];
//        [person setName:@"獭兔" andAge:27];
//        NSString* info = [person info];
//        NSLog(@"person -info 的信息为:%@", info);
//        [FKperson foo];
        returnSelf *rt = [[returnSelf alloc] init];
        //连续调用同一个方法
        [[[rt grow] grow] grow];
        NSLog(@"rt 的_age 成员变量值是: %d", rt->_age);   
    }
    return 0;
}

id 类型

定义

  • Objective-C 提供了一个id类型,这个id 类型可以代表所有对象的类型。也就是说,任意类的对象都可赋值给 id 类型的变量。
    当通过 id 类型的变量来调用方法时,Objective-C 将会执行动态鄉定。所谓动态鄉定,是指 Obiective-C 将会跟踪对象所属的关,它会在运行时判断该对象所属的类,并在运行时确定
int main(int argc, const char * argv[]) {
    @autoreleasepool {
//        FKperson * person = [[FKperson alloc] init];
//        [person say:@"Hello, I love iOS "];
//        [person setName:@"獭兔" andAge:27];
//        NSString* info = [person info];
//        NSLog(@"person -info 的信息为:%@", info);
//        [FKperson foo];
//        returnSelf *rt = [[returnSelf alloc] init];
//        [[[rt grow] grow] grow];
//        NSLog(@"rt 的_age 成员变量值是: %d", rt->_age);
        
//
        id p = [[FKperson alloc] init];
        [p say:@"你好,欢迎学习iOS!"];
    }
    return 0;
}

在这里插入图片描述

OC-方法详解

定义与属性

  • 方法是类或对象的行为特征的抽象,也是类或对象最重组成部分。
    从功能上看方法完全类似于传统结构化程序设计里的函数。值得指出的是,0bjective-C的方法不能独立存在,
    所有的方法都业须定义在类里,方法在逻辑上要么属于类,要么属于对象。

属性

  • 方法与传统函数具有显著不同:在结构化编程语音里,函数是
    一等公民。整个软件由个个的函数组成:在面向对象的编程语言里,类才是一等公民。因此,在Objective-C 语言里方法不能独立存在,方法必须属于类或对象。

  • 如果需要定义方法,则只能在类体内定义,不能独立定义一个方法(定义的只能是函数)。

  • 一旦将一个方法定义在某个类的类体内,如果这个方法使用了+标识符,则这个方法就属于这个类:如果使用了 “- ” 标识符,则这个方法就属千这个类的实例,因为 0bjective-C里的方法不能独立存在,它必須属于一个类或者个对象,因此方法也不能向函数独立执行,执行方法时必须使用类或者对象来最为调用者,方法必须使用如下模板

     1.类 方法] 或者2.[对象 方法]
    

形参个数可变的方法

  • 在定义方法时 在最后一个形参名后面加逗号和三个点(,…)则表明该形参可以接受多个参数值

     下面定义了一个参数可变的方法
    

在这里插入图片描述

图中的函数

在这里插入图片描述

  • 7
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值