oc中实例变量的三种可见度/oc中的方法

oc中实例变量的三种可见度

在objective-c中,实例变量共有四种可见度,最常用的三种分别是:public、protected和private。

protected为默认,private根据需求使用。对于默认可见度的实例变量,可以不使用关键字修饰,也可以使用@protected修饰。但是,不管实例变量是哪种可见度,在对象内部,即类的实现中,都可以使用。

public和protected的区别。如果对象的实例变量是默认可见度的,在外部,无法通过“->”操作实例变量,会出现car->_carBrand

实例变量是属于某个对象的,如果使用public修饰,在外部就可以任意设置和读取某个实例变量的值,这个不符合面向对象的特性--封装。

如果需要在外部获取实例变量的值,需要定义一个方法,带返回值,返回值类型就是需要获取的实例变量的类型。通过这个方法,只能获取一个实例变量的值。


2.  OC中的方法

2.1方法的分类、命名规则、声明,如何确定方法名

(1)分类:方法分为两类:类方法和实例方法。

    类方法:只有类能使用。以‘+’开头,+(id)alloc;

             [AudiCar alloc];

    实例方法:只有对象能使用。以‘-’开头,-(void)study;

             [student study];

(2)命名规则:采用“驼峰命名法”,第一个单词首字母小写,后面的单词首字母大写。

(3)声明:

           -    (void) study  :    (NSString*) course;

          方法   返回       方法       参数

          类型   类型       参数       类型     参数名

 

(4)确定方法名:去掉方法类型、返回值、参数类型、参数名,剩下的部分就是方法名,OC中方法不能重名,但是相同名字的实例方法和类方法并不能算是同一个方法。


2.2 定义带参数方法和带返回值方法


   (1)定义带参数的方法,实现在外部通过方法实现对实例变量的赋值操作。

类的实现:

- (void)setCarBrand:(NSString *)brand;

{

   _carBrand = brand;

}

 

-   (void)setCarBrand:(NSString *)brand carColor: (NSString *)color

{

   _carBrand = brand;

   _carColor = color;

          }

  

外部使用:

AudiCar * car =[[AudiCar alloc] init];

[car setCarBrand:@”奥迪” carColor:@”黑色”];

 

  (2)定义带返回值的方法,实现在外部通过方法实现对实例变量的取值操作。

类的实现:

- (NSInteger)carPrice

{

   return _carPrice;

}

 

外部使用:

AudiCar * car =[[AudiCar alloc] init];

NSLog(@”汽车的价格:%d”,[car carPrice]);



2.3 自定义初始化方法.

在init初始化方法中,只能进行一些默认初始化设置,如果想在初始化方法中根据需求进行初始化设置,例如:初始化AudiCar对象时,需要设置品牌和价格。可以通过自定义初始化方法实现。

-(id)initWithCarBrand:(NSString *)brand carPrice: (NSInteger)price

{

   _carBrand = brand;

   _carPrice = price;

   return self;

}

 

外部使用:

AudiCar * car = [[AudiCaralloc] initWithCarBrand: @”奥迪” carPrice: 100];

NSLog(@”汽车的价格:%d”,[car carPrice]);

2.4方法的“声明”,“实现”,“执行”

(1)声明:

              -(id)initWithCarBrand: (NSString*)brand carPrice: (NSInteger)price

              

(2)实现:

{

   _carBrand = brand;

   _carPrice = price;

   return self;

}

             

(3)执行:

                 [car initWithCarBrand:@”奥迪” carPrice:100];给对象car发送消息,就会执行这个方法。


 

2.4 #import的作用。@class的作用。

  (1)#import的作用是导入文件,相当于将文件的内容进行拷贝。例如:

 

   #import “Teacher.h”

   @interface Student:NSObject

  {

       Teacher * _myTeacher;

  }

 

 #import “Teacher.h”相当于将Teacher.h文件中的内容拷贝到Student.h文件中,这样可以得到Teacher.h文件中的所有信息。

 #import 可以重复导入文件,不会报错。#include 不能重复导入文件,但是现在Xcode已经自动解决这个重复引用的问题。

(2)@class是告诉编译器,某个字段知识作为类名使用,类的接口的信息不知道。

   @class “Teacher.h”

   @interface Student:NSObject

  {

       Teacher * _myTeacher;

  }

(3)使用#import时需要注意一个问题,避免出现循环引用。例如:

 

#import “Teacher.h”

  @interface Student:NSObject

  {

       Teacher * _myTeacher;

  }

 

   #import “Student.h”

  @interface Teacher:NSObject

  {

       Student * _myStudent;

  }

 

  这样会出现重复引用的问题。


#import <Foundation/Foundation.h>
#import "Person.h"
int main(int argc, const char * argv[])
{

    @autoreleasepool {
        
        Person *person1 = [[Person alloc] init];// 创建一个person对象
        Person *person2 = [Person new];         // new等同于上边的alloc+init
        person1->_address = @"北京市海淀区";
        person1->_hbby = @"生乒乓球";
        
        // 通过方法设置了受保护的实例变量的值
        [person1 setName:@"zhangsai"];
        
        // 通过方法取出了受保护的实例变量的值
        NSString *name = [person1 getName];
        NSLog(@"name = %@",name);
        
        [person2 setName:@"chaochao" withAge:23 withAddress:@"beijing" setIsMayyied:NO];
        NSLog(@"name = %@ ,age = %i , address = %@ , ismarried = %d",[person2 getName], [person2 getAge], person2->_address ,[person2 getIsMarried]);
    
    }
    return 0;
}


在接口中:

#import <Foundation/Foundation.h>

@interface Person : NSObject
{
    // 声明实例变量
    // 公开的
    @public             // 可以被随意访问,可见度高
    NSString *_address;
    NSString *_hbby;
    
    // 受保护的
    @protected          // 可以被本类和子类访问,可见度中等
    NSString *_name;
    int _age;
    
    // 私有的
    @private
    NSString *_sex;     // 性别
    BOOL _isMarried;    // 是否已婚
}



// 设置name
- (void)setName:(NSString *)name;   // 一个冒号代表一个参数,小括号内部是参数类型
                                    // 参数类型后边是参数名称
// 取出name的值
- (NSString *)getName;

// 设置sex的值
- (void)setSex:(NSString *)sex;

// 取出sex的值
- (NSString *)getSex;



// 同时设置多个实例变量内容的方法
- (void)setName:(NSString *)name
        withAge:(int)age
    withAddress:(NSString *)address
   setIsMayyied:(BOOL)y;
// 如何提取方法名:去除类型、返回值、参数类型、参数名、所有小括号
// 如上边的方法名是:setName:withAge:withAddress:


// 设置age的值
- (void)setAge:(int) age;

// 取出age的值
- (int)getAge;

// 设置married的值
- (void)setIsMarried:(BOOL) y;

// 取出married的值
- (BOOL)getIsMarried;
@end

在实现中

#import "Person.h"

@implementation Person
// 实现设置name的方法
- (void)setName:(NSString *)name
{
    _name = name;
}
// 实现取值方法
- (NSString *)getName
{
    return _name;
}

// 实现设置age的方法
- (void)setAge:(int)age
{
    _age = age;
}

// 实现取出age的方法
- (int)getAge
{
    return _age;
}

// 实现设置sex的值
- (void)setSex:(NSString *) sex
{
    _sex = sex;
}

// 实现取出sex的值
- (NSString *)getSex
{
    return _sex;
}


// 实现同时设置多个实例变量的值的方法
- (void)setName:(NSString *)name
        withAge:(int)age
    withAddress:(NSString *)address
   setIsMayyied:(BOOL)y

{
    _name = name;
    _age = age;
    _address = address;
    _isMarried = y;
}

// 设置marry的值
- (void)setIsMarried:(BOOL)y
{
    _isMarried = y;
}

// 取出marry的值
- (BOOL)getIsMarried
{
    return _isMarried;
}
@end


init初始化方法:

NSString *result = [[NSString alloc]initWithFormat:@"name = %@ age = %d address = %@", _name, _age, _address];


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值