iOS 学习如何声明私有变量和私有方法

私有变量

首先来说 OC 中没有绝对的私有变量,这么说基于两点原因

1可修改:   通过KVC  键值编码 来修改私有成员变量的值

2可读取 :  通过底层runtime 获取实例变量Ivar 对应私有值

但是private的存在意义也很明确 不希望被当前类 以外的外界得知.

声明方式 

@private :   作用只能是在自己类

@protected :通常 我们都对变量不做特别约束,只是主观调控其使用 那么就是默认 @protected, 作用范围是自身类 和 继承自身的子类

@public:      作用范围高于@protect  高于@private  在任何地方调用.

私有变量和不希望被外界直接访问的变量应该写在.m文件里面. 如果希望被访问的 @protected 和 @public 应该放在.h文件里面声明

 

使用举栗子:

#import <Foundation/Foundation.h>

@interface MethodDetailMusic : NSObject
{
    @public NSString *publicStr;
}

@property (nonatomic, strong) NSString * img_url;
@property (nonatomic, strong) NSString * amount;
@property (nonatomic, strong) NSString * time;
@property (nonatomic, strong) NSString * title;
@property (nonatomic, strong) NSString * url;
@property (nonatomic, strong) NSString * method_id;

- (void)initPrivateString;

@end
#import "MethodDetailMusic.h"

@interface MethodDetailMusic()
{
    @private NSString *specialPrivateString;
}

//声明一个私有方法
- (void)createPrivateFunction;

@end

@implementation MethodDetailMusic

- (void)createPrivateFunction
{//TODO:实施一个私有方法
    
}

- (void)initPrivateString
{
    if (!specialPrivateString) {
        specialPrivateString = @"我是私有变量";
    }
    NSLog(@"%@",specialPrivateString);
}
- (void)viewDidLoad {
    [super viewDidLoad];
    [self test1];//调用
}

- (void)test1
{
    MethodDetailMusic *music = [[MethodDetailMusic alloc]init];
    music.title = @"haha";
    [music initPrivateString];//这里 调用类本身的实例方法有一处日志
    
    NSLog(@"\n title:%@ \n",music.title);
    
    //可修改: KVC 键值编码 修改私有变量
    [music setValue:@"修改私有变量的值" forKey:@"specialPrivateString"];
    [music initPrivateString];
    
    //可读取 #import <objc/runtime.h>  获取私有变量
    //定义一个实例变量 privateString
    Ivar privateString = class_getInstanceVariable([music class], "specialPrivateString");
    NSString *privateStr = object_getIvar(music, privateString);
    NSLog(@"打印私有变量===%@",privateStr);
    
    music->publicStr = @"我是公有变量";
    
    [self viewControllerPrivateFunc];

}

log 日志:

2016-08-17 14:36:23.860 LearningTheroyDemo[10907:5802354] 我是私有变量

2016-08-17 14:36:23.860 LearningTheroyDemo[10907:5802354] title:haha 

2016-08-17 14:36:23.860 LearningTheroyDemo[10907:5802354] 修改私有变量的值

2016-08-17 14:36:23.861 LearningTheroyDemo[10907:5802354] 打印私有变量===修改私有变量的值

私有方法声明

方法1:就是在.m文件里面声明的方法 只能在当前页面调用 (在.h文件中声明的方法 是可以被外界调用的)

如代码music 模型中 .m方法里私有方法的声明和实施

方法2: 建立类别(也有人管这个叫分类), 网上有人 认为 在这里建立 是对应类的私有方法.

但是我并不这么认为,我主要使用类别分散代码. 一块 一块很规矩 可读性明显增强,如果在第三个类里面写声明 还是可以调用的,  但是如果你就想当私有方法的话 也并没有太大问题.使用条件 你都清楚了.写错就赖你自己没注意约束条件吧.

 (如果觉得我说的有错误 求指正,不要放过 我写出的bug 给我提bug 我一定会执行反馈的!!!)

 

posted on 2016-08-17 16:20  ACM_Someone like you  阅读(5079)  评论(0编辑  收藏  举报

导航