IOS中实例的权限控制
- @public、@protected、@private的使用
在OC中声明一个类的时候,可以使用上面 @public、@protected、@private三个关键字声明实例的权限,例如下面的代码:
#import <Foundation/Foundation.h> @interface Person : NSObject
{
@public
NSString *_height;
@protected
NSString *_weight;
@private
NSString *_wife;
} @end @interface Person ()
{
@public
NSString *_name;
@protected
NSString *_sex;
@private
NSString *_phoneNO;
} - (void)publicMethod; @end @implementation Person - (instancetype)init
{
if(self = [super init])
{
_height = @"1.8m";
_weight = @"65Kg";
_wife = @"none";
_name = @"zhangSan";
_sex = @"man";
_phoneNO = @"";
}
return self;
} - (void)publicMethod
{ } @end
在.h文件中定义了三个实例,这三个实例的权限和public、protected、private相对应,对于一个Person类型的对象p,_name在任何地方都是可以访问的,_sex只能在Person
的子类中访问,_wife只能自己内部访问。在.m文件中定义的三个实例也与public、protected、private相对应,需要注意的是,在其它文件中定义的Person类型的对象p,都不能访问到这三个实例,只有在.m文件内部,public、protected、private才会起到对应的作用。实际上OC中实例的权限控制只是编译时的一种权限限制,在OC runtime的类结构中,实例变量是不存在权限控制的,同样类方法、实例方法也不存在权限控制。
- 对于KVC来说,无论实例是哪种权限都是可以轻松访问到的,如下面的代码:
@interface Student : Person @end @implementation Student + (void)testProtected
{
Person *p = [Person new];
NSLog(@"%@",p->_height);
NSLog(@"%@",p->_weight);
} - (NSString *)description
{
Person *p = [Person new];
NSLog(@"%@",p->_height);
NSLog(@"%@",p->_weight);
// NSLog(@"%@",p->_wife);
// [p publicMethod];
// [self publicMethod];
//return [NSString stringWithFormat:@"name == %@\nsex == %@\nphone == %@",_name, _sex,_phoneNO]
// return [NSString stringWithFormat:@"name == %@\nsex == %@",_name, _sex];
// return [NSString stringWithFormat:@"%@ , %@ , %@",_height , _weight ,_wife];
return [NSString stringWithFormat:@"%@ , %@",_height , _weight]; } @endKVC访问:
#import "Other.h"
#import "Person.h" @interface Other : NSObject - (void)testProtected; - (void)testKVC; @end @implementation Other - (void)testProtected
{
Person *p = [Person new];
NSLog(@"%@",p->_height);
// NSLog(@"%@",p->_weight);
} - (void)testKVC
{
Person *p = [Person new];
NSLog(@"%@",[p valueForKey:@"_name"]);
NSLog(@"%@",[p valueForKey:@"_sex"]);
NSLog(@"%@",[p valueForKey:@"_phoneNO"]); NSLog(@"%@",[p valueForKey:@"_wife"]); } @end实际KVC读取一个实例变量:
- (id)valueForKey: (NSString*)key
{
if (!key) {
id value = [self valueForUndefinedKey:nil];
return value;
} const char *keyCString = [key UTF8String];
SEL sel = sel_getUid(keyCString); // FIXME: getKey, _getKey, isKey, _isKey are missing if ([self respondsToSelector:sel]) {
id value = [self _wrapReturnValueForSelector:sel];
return value;
} size_t keyCStringLength = strlen(keyCString);
char *selBuffer = __builtin_alloca(keyCStringLength + ); char *keyname = __builtin_alloca(keyCStringLength + );
strcpy(keyname, keyCString); #define TRY_FORMAT(format)\
sprintf(selBuffer, format, keyname);\
sel = sel_getUid(selBuffer);\
if ([self respondsToSelector:sel]) {\
id value = [self _wrapReturnValueForSelector:sel];\
return value;\
}
TRY_FORMAT("_%s");
keyname[] = toupper(keyname[]);
TRY_FORMAT("is%s");
TRY_FORMAT("_is%s");
// TRY_FORMAT("get%s");
// TRY_FORMAT("_get%s");
#undef TRY_FORMAT if ([isa accessInstanceVariablesDirectly]) {
sprintf(selBuffer, "_%s", keyCString);
sel = sel_getUid(selBuffer); if ([self respondsToSelector:sel]) {
id value = [self _wrapReturnValueForSelector:sel];
return value;
} Ivar ivar = class_getInstanceVariable(isa, selBuffer);
if (!ivar) {
ivar = class_getInstanceVariable(isa, keyCString);
} if (ivar) {
id value = [self _wrapValue:(void*)self + ivar_getOffset(ivar) ofType:ivar_getTypeEncoding(ivar)];
return value;
} } id value = [self valueForUndefinedKey:key];
return value;
}
IOS中实例的权限控制的更多相关文章
- 【JEECG技术博文】JEECG 简单实例解说权限控制
JEECG简单实例解说权限控制 请大家点击这里为我们投票.2015博客之星.很多其他分享敬请期待 博文地址:http://blog.itpub.net/30066956/viewspace-18687 ...
- (转)浅析Java中的访问权限控制
原文地址: http://www.cnblogs.com/dolphin0520/p/3734915.html 今天我们来一起了解一下Java语言中的访问权限控制.在讨论访问权限控制之前,先来讨论一下 ...
- 浅析Java中的访问权限控制
浅析Java中的访问权限控制 今天我们来一起了解一下Java语言中的访问权限控制.在讨论访问权限控制之前,先来讨论一下为何需要访问权限控制.考虑两个场景: 场景1:工程师A编写了一个类ClassA,但 ...
- .NetCore中如何实现权限控制 基于Claim角色、策略、基于Claim功能点处理
.NetCore中如果实现权限控制的问题,当我们访问到一个Action操作的时候,我们需要进行权限控制 基于claims 角色控制 基于角色控制总觉得范围有点过大,而且控制起来感觉也不是太好,举一个例 ...
- Java中的访问权限控制
Java提供了public, private, protected 三个访问权限修饰词,提供了以下四种访问权限控制机制: 1.包访问权限: 2.Public访问权限: 3.Private访问权限: 4 ...
- WPF wpf中按钮操作权限控制
权限控制我们有很多种方式可以实现. 这次项目中做个简单的权限控制,我们在所有按钮触发前判断,有权限则可执行. 我们自定义一个命令类. public class DelegateCommand : IC ...
- JEECG 简单实例讲解权限控制
业务背景:某公司要实现一个日志系统,用来了解员工的工作量饱和情况. 需求: 1.角色分为:员工.经理 两种. 2.员工每天在日志系统中填报工作总结,然后经理进行点评. 3.表单内容包含:姓名.日期.工 ...
- pc vue 项目中的菜单权限控制
在pc 管理系统这种类型的产品,通常会涉及到账号权限的控制,不同的账号权限能浏览的功能模块是不同的,对应侧边栏菜单模块的显示也会不同. 场景一.(电商类管理系统) 登录 登录后,依次获取账号 toke ...
- iOS中几种定时器 - 控制了时间,就控制了一切
在软件开发过程中,我们常常需要在某个时间后执行某个方法,或者是按照某个周期一直执行某个方法.在这个时候,我们就需要用到定时器. 然而,在iOS中有很多方法完成以上的任务,到底有多少种方法呢?经过查阅资 ...
随机推荐
- c#:readonly与const的区别
readonly与const的区别: 1.初始化:const 字段只能在该字段的声明中初始化. readonly 字段可以在声明或构造函数中初始化. 2.值: const 字段是编译时常量(con ...
- php的redis函数
phpredis中文手册--<redis中文手册> php版 redis中文手册:http://readthedocs.org/docs/redis/en/latest/ 本文是参考& ...
- Ubuntu 16.04 samba相关配置
samba是 SMB/CIFS网络协议的重新实现,它作为NFS的补充使得在Linux和Windows系统之间进行文件共享.打印更容易实现. 相关介绍: SAMBA套件: (1)samba:这个套件主要 ...
- Duilib使用wke显示echarts
不得不说wke是个简洁好用的浏览器内核.网上很多大神已经把wke嵌入到duilib中了,先感谢他们辛勤的工作.这里通过wke吧C++的数据在ECharts上美观的显示出来.借鉴前人,将ECharts进 ...
- web字体图标的使用
今天给大家介绍一些web字体图标的下载和使用 一.WEB字体 1. 下载外部的字体图标的网站 font-awesome.com 2.CSS文件和font文件 3.html文档中使用外部字体 4.下载字 ...
- img 转化成iso镜像的办法
最近在使用KVM启用虚拟机,然后将里面的环境和配置 配置成我们公司需要的环境,再打包成iso镜像,之后再次生成新的虚拟机. 但是KVM启动出的镜像生成的是img镜像 ,需要将img镜像转换成iso镜像 ...
- PHP学习过程_Symfony_(4)_命令创建实体_以及实体关系
//项目运行php app/console server:run//创建实体php app/console doctrine:generate:entitybundle名称:实体名称例如:Symfon ...
- The property System
The property System 和其它编译器厂商一样, Qt 也提供了复杂的属性机制, 但是作为一个编译器无关.平台无关的库,Qt没有那些不被标准编译器支持的特征, 如 BCB的 __prop ...
- [Q]pdfFactory打印机纸张方向设置为横向
不推荐更改pdfFactory打印机默认纸张方向(默认为横向),更改后可能导致不必要的麻烦(pdfFactory要求所定义的纸张方向与实际的纸张方向需一致,因此若更改为横向,则纸张宽度的定义需大于纸张 ...
- CentOS7中将Mysql添加为系统服务
如果是自己通过tar包安装的Mysql,不会自动添加到系统服务中,可通过如下方式,自己添加. 先启动一下mysql ${mysql}/support-files/mysql.server start ...