私有变量

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

iOS 学习如何声明私有变量和私有方法的更多相关文章

  1. 第七章 函数表达式和函数声明,关于this对象 ,私有作用域(function(){})() ,私有变量和特权方法

    一:函数表达式和函数声明 1:函数声明和函数表达式的区别 ①函数声明不需要分号结尾 ②函数声明有函数提升的特点 ③函数声明后面不能跟圆括号直接调用,因为javascript将function关键字当作 ...

  2. JavaScript 执行环境(执行上下文) 变量对象 作用域链 上下文 块级作用域 私有变量和特权方法

    总结自<高程三>第四章  理解Javascript_12_执行模型浅析   JS的执行环境与作用域  javascript高级程序第三版学习笔记[执行环境.作用域] 在javascript ...

  3. python 类的私有变量和私有方法

    #!/usr/bin/env python # -*- coding:utf-8 -*- # @Time : 2017/11/08 8:46 # @Author : lijunjiang # @Fil ...

  4. 反射工具类.提供调用getter/setter方法, 访问私有变量, 调用私有方法, 获取泛型类型Class,被AOP过的真实类等工具函数.java

    import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.Validate; import org.ap ...

  5. Python保护变量、私有变量、私有方法

    保护变量.私有变量.私有方法介绍: _xxx: 单下划线开头叫保护变量,意思是只有类对象和子类对象自己能访问到这些变量,此变量不能通过from XXX import xxx 导入: __xxx : 双 ...

  6. Python类中的 私有变量和私有方法

    默认情况下,Python中的成员函数和成员变量都是公开的(public),在python中没有类似public,private等关键词来修饰成员函数和成员变量.在python中定义私有变量只需要在变量 ...

  7. js静态私有变量(将方法变成原型模式,被所有实例共享,而方法操作变量,故变量是静态)

    js静态私有变量(将方法变成原型模式,被所有实例共享,而方法操作变量,故变量是静态) 一.总结 1.js函数中的private和public:js函数中的私有变量 var 变量名,公有变量 this. ...

  8. iOS 运行时runtime控制私有变量以及私有方法

    OC是运行时语言,只有在程序运行时,才会去确定对象的类型,并调用类与对象相应的方法.利用runtime机制让我们可以在程序运行时动态修改类.对象中的所有属性.方法,就算是私有方法以及私有属性都是可以动 ...

  9. [python] 私有变量和私有方法

    1.在Python中要想定义的方法或者变量只在类内部使用不被外部调用,可以在方法和变量前面加 两个 下划线 #-*- coding:utf-8 -*- class A(object): name = ...

随机推荐

  1. Android Studio 使用笔记:给包重命名~~有点水

    很简单,选择需要重命名的包,按下 Shift + F6 这时候出现提示,选择 Rename package 输入新的包名,Refactor按钮会变亮,点击就可以了. 注意:这个是重命名一个包名,想做 ...

  2. OpenCV中Kinect的使用(2)

    接OpenCV中Kinect的使用(1),主要讲述OpenCV中关于Kinect接口(类 VideoCapture )的一些使用介绍. 类 VideoCapture 支持Kinect传感器.使用 Vi ...

  3. Prime pair connection (Project Euler 134)

    题目大意: 对于连续的质数$p1$, $p2$, 满足$5 <= p1 <= 1000000$ 求出最小的整数$S$, 它以 $p1$结尾并且能够被$p2$整除. 求$S$的和. 思路: ...

  4. chrome 设置代理服务器

    通过设置google chrome浏览器的代理服务器可以让google chrome浏览器通过代理服务器上网,可以隐藏本机的IP地址或者访问一些不能直接访问的网站. 工具/原料   google ch ...

  5. Webkit内核探究【2】——css简介

    注:[转载请注明文章来源.保持原样] 出处:http://www.cnblogs.com/jyli/archive/2010/01/31/1660364.html 作者:李嘉昱 CSS在Webkit中 ...

  6. iOS -- 全局导航栏返回键

    [UINavigationBar appearance].backIndicatorTransitionMaskImage = [UIImage imageNamed:@"backArrow ...

  7. PHP中通过数组遍历找出最小值

    举例: $a = array(1,2,4,0,9,8,6);//定义一个数组 $len = count($a);//获取数组的长度 $min = $a[0];//默认情况下数组的第一个值是最小的 fo ...

  8. xshell ftp报错:找不到匹配的outgoing encryption算法

    场景:由于登陆跳板机都是从采用密钥的方式进行登陆的,然后在传输文件的时候报错 报错信息: 解决方案: 点击属性--->选择aes256-ctr加密方式默认这里是没有选择的 再次连接就成功连接上去 ...

  9. jpofiler监控JVM

    1.官方下载地址,选择自己想要的版本 https://www.ej-technologies.com/download/jprofiler/version_92 2.分为linux服务端.window ...

  10. jqgrid 事件说明

    Events(事件) 事件响应动作被设置为表格的属性,以下定义了行被选中时的响应: var lastSel; jQuery("#gridid").jqGrid({ ...    o ...