• @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]; } @end

    KVC访问:

  • #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中实例的权限控制的更多相关文章

  1. 【JEECG技术博文】JEECG 简单实例解说权限控制

    JEECG简单实例解说权限控制 请大家点击这里为我们投票.2015博客之星.很多其他分享敬请期待 博文地址:http://blog.itpub.net/30066956/viewspace-18687 ...

  2. (转)浅析Java中的访问权限控制

    原文地址: http://www.cnblogs.com/dolphin0520/p/3734915.html 今天我们来一起了解一下Java语言中的访问权限控制.在讨论访问权限控制之前,先来讨论一下 ...

  3. 浅析Java中的访问权限控制

    浅析Java中的访问权限控制 今天我们来一起了解一下Java语言中的访问权限控制.在讨论访问权限控制之前,先来讨论一下为何需要访问权限控制.考虑两个场景: 场景1:工程师A编写了一个类ClassA,但 ...

  4. .NetCore中如何实现权限控制 基于Claim角色、策略、基于Claim功能点处理

    .NetCore中如果实现权限控制的问题,当我们访问到一个Action操作的时候,我们需要进行权限控制 基于claims 角色控制 基于角色控制总觉得范围有点过大,而且控制起来感觉也不是太好,举一个例 ...

  5. Java中的访问权限控制

    Java提供了public, private, protected 三个访问权限修饰词,提供了以下四种访问权限控制机制: 1.包访问权限: 2.Public访问权限: 3.Private访问权限: 4 ...

  6. WPF wpf中按钮操作权限控制

    权限控制我们有很多种方式可以实现. 这次项目中做个简单的权限控制,我们在所有按钮触发前判断,有权限则可执行. 我们自定义一个命令类. public class DelegateCommand : IC ...

  7. JEECG 简单实例讲解权限控制

    业务背景:某公司要实现一个日志系统,用来了解员工的工作量饱和情况. 需求: 1.角色分为:员工.经理 两种. 2.员工每天在日志系统中填报工作总结,然后经理进行点评. 3.表单内容包含:姓名.日期.工 ...

  8. pc vue 项目中的菜单权限控制

    在pc 管理系统这种类型的产品,通常会涉及到账号权限的控制,不同的账号权限能浏览的功能模块是不同的,对应侧边栏菜单模块的显示也会不同. 场景一.(电商类管理系统) 登录 登录后,依次获取账号 toke ...

  9. iOS中几种定时器 - 控制了时间,就控制了一切

    在软件开发过程中,我们常常需要在某个时间后执行某个方法,或者是按照某个周期一直执行某个方法.在这个时候,我们就需要用到定时器. 然而,在iOS中有很多方法完成以上的任务,到底有多少种方法呢?经过查阅资 ...

随机推荐

  1. Maven之(九)依赖关系

    在maven的管理体系中,各个项目组成了一个复杂的关系网,但是每个项目都是平等的,是个没有贵贱高低,众生平等的世界,全球每个项目从理论上来说都可以相互依赖.就是说,你跟开发spring的大牛们平起平坐 ...

  2. maven初步入门demo

    Maven是跨平台的项目管理工具.作为Apache组织中的一个颇为成功的开源项目,主要服务于基于java平台的项目构建.依赖管理和项目信息管理. maven本身使用java开发而成,所以使用前确保电脑 ...

  3. cuda编程(一)

    环境安装和例程运行 显卡主要有两家,ATI.NVIDIA,简称A卡和N卡.随着GPU计算能力的上升,采用GPU并行计算来加速的应用越来越多. Nvidia创立人之一,黄仁勋(Jen-Hsun Huan ...

  4. android 实现与服务器的长链接 方式

    http://blog.csdn.net/coffeeco/article/details/13276437  这边文章主要看服务端,使用tomcat7以上实现服务端的接收消息以及消息发送 http: ...

  5. Android平台 视频编辑的高级版本

    基本覆盖了秒拍,美拍,快手等视频编辑的大部分功能. 增加了44种滤镜,基本覆盖市面上大部分APP中的滤镜效果. 可以实现视频和视频, 视频和图片,视频和您的UI界面叠加. 在叠加的过程中:支持任意时间 ...

  6. 在ubuntu14.04上安装openstack mitaka

    最近在工作环境安装部署了juno版本,在GE口测试网络性能不太满意,发现mitaka版本支持ovs-dpdk,于是抽时间安装实验一番. 参考官网的安装文档,先准备将mitaka版本安装好再配置ovs. ...

  7. 浙大pat1013题解

    1013. Battle Over Cities (25) 时间限制 400 ms 内存限制 32000 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue It ...

  8. HDU 1329 Hanoi Tower Troubles Again!(乱搞)

    Hanoi Tower Troubles Again! Problem Description People stopped moving discs from peg to peg after th ...

  9. sharepoint 2013基于AD的Form表单登录(三)——选择用户时,屏蔽掉AD。

    //来源:http://www.cnblogs.com/lrforever/p/3695820.html 隐藏AD人员选择,$ad.IsVisible设置为true,则显示出AD里用户 $cpm = ...

  10. centOS静态ip设置

    设置静态IP地址 1,先搜索了一下,得到以下解释IP          P地址Netmark     子网掩码Gateway     默认网关HostName    主机名称DomainName  域 ...