2、实例变量可⻅度与方法

实例变量可⻅度

可见度特点
public(公有的)实例变量可以在类的外部和内部操作
protected(受保护的,默认的)实例变量只能在该类和其⼦类内操作
private(私有的)实例对象只能在该类内访问

注:所谓的内部,指的是相应类的@implementation 和@end之间

// .h文件中
@interface Person : NSObject 
{ 
     @public 
     NSString *_hobby; //兴趣
     @protected 
     NSString *_name; //姓名
     int _age; //年龄
     @private 
     NSString *_sex; //性别
}

// main函数文件中

//@public
Person * p = [[Person alloc] init];
p -> _hobby = @“听⾳乐、看电影”;
NSLog(@"⼈的兴趣:%@",p -> _hobby);

//@protected

protected的使用

//@private

private的使用

注意事项:

  1. 为什么不使⽤@public?
    • 使⽤@public关键字,暴露了类内部的细节
    • 不符合⾯向对象语⾔的三⼤特性之⼀——封装
  2. 如何在其他⽂件中访问对象@protected修饰的实例变量?
    • 提⽰:添加两个⽅法
    • 赋值:通过⽅法传⼊参数,在类的内部实现实例变量赋值
    • 取值:通过⽅法获取实例变量的值

⽅法

无参方法声明实现及调用

对象方法
  • 对象方法以-开头如 -(void)xx;
  • 对象方法只能由对象来调用
  • 对象方法中可以访问当前对象的成员变量
  • 调用格式 [对象名 对象方法名];
类方法
  • 类方法以+开头 如+(void)put;
  • 类方法只能由类来调用
  • 类方法中不能访问实例(成员)变量,因为类方法由类来调用,并没有创建存储空间来存储类中的成员变量
  • 调用格式:[类名 类方法名];
  • 类方法的好处和适用场合:
    • 不依赖于对象,执行效率更高;
    • 能用类方法解决的问题,尽量使用类方法;
    • 场合:当方法内部不需要使用到成员变量时,可以改为类方法。
声明
//方法类型  返回值类型  方法名
      -    (double)    pi;
调用

使用对象调用方法就是OC中的消息机制
oc语言中采用特定的语言调用类或者实例(对象)的方法称为发送消息或方法调用。

//格式:[类名或者对象名 方法名];
Person * p = [[Person alloc] init];
[p eat];

有参有返回值

有参有返回值方法声明

方法名
  • 删除:类型标识,返回类型,参数类型,参数名,空格。例如:

    replaceObjectAtIndex:withObject:

  • 类中不能出现同名⽅法。

  • “ : ” 标识参数,不能省略。有冒号必须有参数。

初始化、赋值、取值⽅法(init、setter、getter)

初始化

//.h 文件
//声明属性
@interface AoDiCar : NSObject
{
    NSString *_color;
    int _lunzi;
    NSString *_pinpai;
}
//init
-(id)initWithColor:(NSString *)color
               lunzi:(int)lunzi
              pinpai:(NSString *)pinpai;

//.m 文件
//init
-(id)initWithColor:(NSString *)color
               lunzi:(int)lunzi
              pinpai:(NSString *)pinpai{
    _color = color;
    _lunzi = lunzi;
    _pinpai = pinpai;
    return self;
}

单个参数

//.h 文件
//赋值
- (void)setName:(NSString *)name;
//取值
- (NSString *)getName;

//.m 文件
//赋值
- (void)setName:(NSString *)name{
    _name = name;
}
//取值
- (NSString *)getName{
    return _name;
}

多个参数

//.h 文件
//setter
-(void)setColor:(NSString *)color
          lunzi:(int)lunzi//注意,这里没有分号
         pinpai:(NSString *)pinpai;//这里才有分号

//getter
-(NSString *)color;
-(int)lunzi;
-(NSString *)pinpai;

//.m 文件
//setter
-(void)setColor:(NSString *)color
          lunzi:(int)lunzi
         pinpai:(NSString *)pinpai{
    _color = color;
    _lunzi = lunzi;
    _pinpai = pinpai;
}

//getter
-(NSString *)color{
    return _color;
}
-(int)lunzi{
    return _lunzi;
}
-(NSString *)pinpai{
    return _pinpai;
}

调用

//main函数
AoDiCar *car1 = [[AoDiCar alloc] initWithColor:@"黑色" lunzi:4 pinpai:@"不造"];//初始化
NSLog(@"%@奥迪有%d个轮子,品牌%@",[car1 color],[car1 lunzi],[car1 pinpai]);//输出初始化的数据

[car1 setColor:@"红色" lunzi:4 pinpai:@"不造"];//用setter赋值
NSLog(@"%@奥迪有%d个轮子,品牌%@",[car1 color],[car1 lunzi],[car1 pinpai]);//用getter取值

@class

用于引入类,但并不引入类的属性

IOS基础:深入理解Objective-c中@class的含义
objective-c中,当一个类使用到另一个类时,并且在类的头文件中需要创建被引用的指针时,有两种办法:
一种是通过#import方式引入;另一种是通过@class引入;

#import "B.h"//引入类,同时引入类属性
@class B;//仅引入类
@interface A : NSObject {   
    //A类是引用类,B类是被引用类  
    B *b;   
}   
@end

### instancetype和id的区别

  • instancetype在类型表示上,跟id一样,可以表示任何对象类型;
  • instancetype只能用在返回值类型上,不能像id一样用在参数类型上;
  • instancetype比id多一个好处:编译器会检测instancetype的真实类型;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值