您的位置:首页 > 其它

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

2015-11-02 21:58 295 查看

实例变量可⻅度

可见度特点
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




//@private




注意事项:

为什么不使⽤@public?

使⽤@public关键字,暴露了类内部的细节

不符合⾯向对象语⾔的三⼤特性之⼀——封装

如何在其他⽂件中访问对象@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的真实类型;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: