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 = @"1122334455";
    }
    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 + 5);
    
        char *keyname = __builtin_alloca(keyCStringLength + 1);
        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[0] = toupper(keyname[0]);
        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;
    }
时间: 2024-10-11 07:13:27

IOS中实例的权限控制的相关文章

JEECG 简单实例讲解权限控制

JEECG简单实例讲解权限控制 博文地址:http://blog.itpub.net/30066956/viewspace-1868754/ 作者: 许国杰 一.业务背景 某公司要实现一个日志系统,用来了解员工的工作量饱和情况. 二.需求 1.角色分为:员工.经理两种. 2.员工每天在日志系统中填报工作总结,然后经理进行点评. 3.表单内容包含:姓名.日期.工作总结.个人笔记.日志点评. 三.业务权限描述 1. 员工可以进行日志填报.查看操作.(按钮控件权限) 2. 经理可以进行日志点评.查看操

浅析Java中的访问权限控制

浅析Java中的访问权限控制 今天我们来一起了解一下Java语言中的访问权限控制.在讨论访问权限控制之前,先来讨论一下为何需要访问权限控制.考虑两个场景: 场景1:工程师A编写了一个类ClassA,但是工程师A并不希望ClassA被该应用中其他所用的类都访问到,那么该如何处理? 场景2:如果工程师A编写了一个类ClassA,其中有两个方法fun1.fun2,工程师只想让fun1对外可见,也就是说,如果别的工程师来调用ClassA,只可以调用方法fun1,那么该怎么处理? 此时,访问权限控制便可以

[转]iOS 中几种定时器 - 控制了时间,就控制了一切

这篇文章是转载内容,原文地址:http://www.cocoachina.com/ios/20150519/11857.html?utm_source=tuicool 这里的知识点,其实在我们日常开发中还是比较常见的,例如本人之前写过的两篇随笔: NSTimer 的使用:178实现满天飞雪效果 CADisplayLink 的使用:156 UIImageView 和 CADisplayLink 实现 Tom 汤姆猫动画效果的区别(扩展知识:分组(黄色文件夹)和文件夹引用(蓝色文件夹)区别) ---

ThinkPHP中:RBAC权限控制的实习步骤

使用版本ThinkPHP3.1.3 第一步,建表及数据 第二步,建关联模型 第三步,控制器使用关联模型.配置文件 第四步,模板显示数据 第一步,建表及数据 在数据库中,建立一个companysvn数据库,库下建立五张表 建表好导入数据的代码如下 1 # -------------------------------------------------------- 2 # Host: 127.0.0.1 3 # Server version: 5.0.45-community-nt-log 4

iOS应用部分权限控制

整理下iOS开发中常用的权限控制,只整理里一些常用的并不全. #import <Foundation/Foundation.h> typedef void (^AuthorizedFinishBlock)(); @interface LYAuthorizedMaster : NSObject #pragma mark - 摄像头权限 +(BOOL)checkCameraAuthority; +(void)cameraAuthorityCheckSuccess:(AuthorizedFinish

Vue 实现前端权限控制

为什么做前端权限控制 前端权限控制并不是新生事物,早在后端 MVC 时代,web 系统中就已经普遍存在对按钮和菜单的显示 / 隐藏控制,只不过当时它们是由后端程序员在 jsp 或者 php 模板中实现的. 随着前后端分离架构的流行,前后端以接口为界实现开发解耦,权限控制也一分为二,前端权限控制的所有权才真正回到了前端. 可能有的同学会想,前后端分别做一套控制,是不是将事情复杂化了,而且从根本上讲前端没有秘密,后端才是权限的关键,那是不是只在后端做控制就可以了. 对于这个问题我们首先应该明确,前后

Java成员的访问权限控制

Java中的访问权限控制包含两个部分: 类的访问权限控制 类成员的访问权限控制 对类来说,访问权限控制修饰符可以是public或者无修饰符(默认的包访问权限): 对于类成员来说,访问权限控制修饰符可以是public,protected, package private(无修饰符), or private. 以下表格总结了类成员中不同访问权限控制修饰符对应的访问级别:

Java中的访问控制权限

简介 Java中为什么要设计访问权限控制机制呢?主要作用有两点: (1)为了使用户不要触碰那些他们不该触碰的部分,这些部分对于类内部的操作时必要的,但是它并不属于客户端程序员所需接口的一部分. (2)为了让类库设计者可用更改类的内部工作方式,而不必担心会对用户造成重大影响. Java中的访问权限控制的等级,按照权限从大到小依次为: Public -> protected -> 包访问权限(没有权限修饰词)-> private. 包(package) Java中包(package)的概念和

C++成员权限控制(总结)

1) 前言 在我学习C++的过程中,类中成员的权限控制一直是比较头疼的一个点,一会public,一会又private,还有protected,再加点继承,而且又有公有继承.私有继承,保护继承,所以感觉会比较乱. 后来不断学习过程中,慢慢理顺了它们的关系,稍微分类总结一下,在这个问题上基本上就没再栽过跟头.如有笔误,希望大神指点一下! 2 )C++的水平权限控制 首先解释几个特定词,下面要用到: 水平权限:在一个类中,成员的权限控制,就是类中的成员函数能否访问其他成员.类的对象能否访问类中某成员.