实例变量可见度和方法

实例变量的可见度分为以下四个:

    // 成员变量及成员变量的可见范围(访问范围)。

    @private // 私有的,只有自己可以访问

    NSString *_name;

    

    @protected // 受保护的,只有自己和自己的子类可以访问

    NSString *_money;

    

    @public  // 共有的,都可以访问

    NSString *_address;

    

    @package // 在这个项目中都可以访问

    NSString *_number;

如果不修饰可见度,默认为@protected.

如果在其他地方引用私有变量,在编译的时候会提示错误:


第一个错误提示为:没有这个属性。没有定义属性。或者只定义了变量,没有使用属性+@synthesize.

第二个错误提示为:没有这个变量,因为变量我们定义的是私有的,如上面的代码定义。

NSLog() 为Object-C里面的输出函数,可以输出信息到标准输出设备上面,这里指XCode的控制台。


方法:

上面一篇文章有提到过方法,这里在说明一下:

Object-C中有两种方法:类方法(+)和实例方法(-)。

类方法(+):只能类使用。一般多用在工具类里面,比如:封装的网络请求、单利等。例如:+ (instancetype)alloc;

                  注意:类方法里面不能使用实例变量。

实例方法(-):只能对象使用,例如:-(void)sayHi;

知道了OC中的方法分类,那方法格式呢?如下:

- (void)replaceObjectAtIndex:(NSUInterger)index  withObject:(id)anobject

说明:- :方法类型 。+ 或 -

       (void): 返回值。可以为空,但是必须写 void.不能为 ()。

         replaceObjectAtIndex:withObject:   参数形容词

        (NSUInterger)或(id): 参数类型

         index 或 anObject  : 参数名

知道了方法的格式,哪一个方法的方法名是什么呢,即为参数形容词:

          replaceObjectAtIndex:withObject: 


知道了方法的格式及方法名,下来介绍一个重要的方法,设置器(setter)和访问器(getter)。

OC里面规定了setter和getter的格式:

声明在.h文件里面

//设置器

- (void)setName:(NSString *)name;

//取值器

- (NSString *)name;


实现在.m文件里面

//设置器

- (void)setName:(NSString *)name{

    _name = name;

}

//取值器

- (NSString *)name{

    return _name;

}


可以看到声明的时候的格式为:

 setter:  set+首字母大写的实例变量名(忽略下划线)

getter:  返回类型和声明类型一直,方法名和变量名相同(忽略下划线)

注意一点的是:在setter里面禁止使用 self. 方法获取实例变量,会导致循环引用。后面会提到。self. 在等到左边是setter方法,在等号右边是getter方法。


初始化方法:

- (instancetype)init; 系统的默认初始化方法,这个方法只能给实例变量设置默认值,不灵活。

- (instancetype)intiWithName:  自定义初始化方法,根据需求定义初始化方法。可以传入name变量的值。灵活

例如下面的初始化方法,可以传入姓名和年龄:

.h中声明方法

// 自定义初始化方法:

- (instancetype)initWithName:(NSString *)name age:(int)age;

.m中实现方法

// 自定义初始化方法:

- (instancetype)initWithName:(NSString *)name age:(int)age{

    self.name = name;

    self.age = age;

    return self;

}


#import  导入头文件:

#import ""  导入自定义头文件

#impott <> 导入类库中的头文件。

和 C中的#include 的区别是,#import可以避免重复导入。

注意:容易出现循环导入的问题。

A类中#import "B",B类中#import "A", 这种情况为循环导入,如何解决?

@class  ,A或B中直接使用哪个  @class B \@class A, 表示 class 修饰的是一个类,后面的字符串做为类名使用,并未导入类的接口内容。有效的避免了循环导入。








猜你喜欢

转载自blog.csdn.net/zhongnanshan_001/article/details/80556690