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

时间:2021-06-25 21:04:58

私有变量

首先来说 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 我一定会执行反馈的!!!)