• @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. ideaIU-2016.2.5激活

    IntelliJ IDEA的在线注册码生成页面 http://idea.iteblog.com 新的License server地址为:http://idea.iteblog.com/key.php

  2. Fedora24 升级到25

    1 安装dnf-plugin-system-upgrade dnf install dnf-plugin-system-upgrade 2 更新软件包 dnf system-upgrade downl ...

  3. <video>和<audio>标签,对视频和音频的支持

    H5新增了<video>和<audio>标签,提供对视频和音频的支持 <audio>的属性与<video>属性相同 <video> vide ...

  4. Front-End(二)——HTML

    本文主要对html迭代学习中的要点.冷点简述罗列. html之前也说过,主要为了描述页面的结构和内容,合理使用结构化的标签,<h1>.<div>等,有利于前端开发,也有利于搜索 ...

  5. ibatis动态修改select出来的字段

    今天自己做了一个测试 , 动态去select出来数据库的字段, 但是我传参数都是正确的 , 可就是无法出来结果, 返回对象NULL . 表示很郁闷 , 然后就google了一下 , 关键词 : iba ...

  6. CODE[VS]-蛇形矩阵-模拟-天梯白银

    题目描述 Description 小明玩一个数字游戏,取个n行n列数字矩阵(其中n为不超过100的奇数),数字的填补方法为:在矩阵中心从1开始以逆时针方向绕行,逐圈扩大,直到n行n列填满数字,请输出该 ...

  7. edittext设置为密文显示

    et_msg.setInputType(InputType.TYPE_CLASS_TEXT |InputType.TYPE_TEXT_VARIATION_PASSWORD);

  8. qwt的安装与使用

    qwt简介 QWT,全称是Qt Widgets for Technical Applications,是一个基于LGPL版权协议的开源项目, 可生成各种统计图. 具体介绍,可参看官方网址:http:/ ...

  9. 来看看CBIS 2017中国(上海)大数据产业创新峰会有哪些大师出席

    CBIS 2017中国(上海)大数据产业创新峰会,围绕"数据+产业.企业+数据.技术+人才.品牌+市场.应用+发展"相继展开话题讨论. CBIS 2017中国(上海)大数据产业创新 ...

  10. select与ajax结合

    要实现的功能是,点击select输入框,数据库里面的数据会以option弹出. 这需要用到ajax异步连接数据库 下面贴出代码 先说明一下后台传递的数据是json,以map的形式传入的.后台代码很简单 ...