私有变量
首先来说 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(@" title:%@ ",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 我一定会执行反馈的!!!)