Objective-c:为什么在使用KVC时私人ivars不会被外部访问隐藏

栏目: Objective-C · 发布时间: 5年前

内容简介:翻译自:https://stackoverflow.com/questions/6122398/objective-c-why-private-ivars-are-not-hidden-from-the-outside-access-when-using
在尝试使用KVC访问ivars之后,我注意到私有和受保护的ivars没有保护.我把它放在ivar(私有或受保护的关键字)前面并不重要 – 当使用KVC方法“setValue”时,ivar总是公共的ivar.这是我的代码,其中所有七个ivars和属性都可以在类实例之外更改:
//************ interface file ***************//
@interface MyClass : NSObject {
@public    
  NSNumber *public_num;
@protected 
  NSNumber *protected_num;
@private 
  NSNumber *private_num;
  NSNumber *private_property;
}
@property (retain) NSNumber *public_property;
@property (retain) NSNumber *private_property;
@end

//********* implementation file *********//
@interface MyClass(){
@private
  NSNumber *very_private_num;
}
@property (retain) NSNumber *very_private_property;
@end

@implementation MyClass
@synthesize public_property, private_property, very_private_property;
@end

//****** main **********//
MyClass *myClass = [[MyClass alloc] init];

[myClass setValue:[NSNumber numberWithInt:1] forKey:@"public_num"];
[myClass setValue:[NSNumber numberWithInt:2] forKey:@"protected_num"];
[myClass setValue:[NSNumber numberWithInt:3] forKey:@"private_num"];
[myClass setValue:[NSNumber numberWithInt:4] forKey:@"public_property"];
[myClass setValue:[NSNumber numberWithInt:5] forKey:@"private_property"];
[myClass setValue:[NSNumber numberWithInt:6] forKey:@"very_private_num"];
[myClass setValue:[NSNumber numberWithInt:7] forKey:@"very_private_property"];

NSNumber *l_public_num = [myClass valueForKey:@"public_num"];
NSNumber *l_protected_num = [myClass valueForKey:@"protected_num"];
NSNumber *l_private_num = [myClass valueForKey:@"private_num"];
NSNumber *l_public_property = [myClass valueForKey:@"public_property"];
NSNumber *l_private_property = [myClass valueForKey:@"private_property"];
NSNumber *l_very_private_num = [myClass valueForKey:@"very_private_num"];
NSNumber *l_very_private_property = [myClass valueForKey:@"very_private_property"];

NSLog(@"public_num = %@, protected_num = %@, private_num = %@, public_property = %@, private_property = %@, very_private_num = %@, very_private_property = %@", l_public_num, l_protected_num, l_private_num, l_public_property, l_private_property, l_very_private_num, l_very_private_property);
NSObject符合 NSKeyValueCoding 非正式协议.这定义了setValue:forKey:和valueForKey:. setValue:forKey:和valueForKey:根据 specific search rules

搜索访问密钥值的方法,包括直接访问实例变量.这种直接访问由accessInstanceVariablesDirectly方法控制,该方法是NSKeyValueCoding非正式协议的一部分,该方法默认返回YES,允许这些方法直接访问实例变量,因此不会真正使它们成为私有.他们仍然是私人直接访问.

要解决此问题,您必须覆盖上述方法并在NSKeyValueCoding非正式协议中定义,以防止其访问.

正如Abizern所提到的,私有变量的属性仍然可以访问,因为Objective-C没有私有方法的概念.

翻译自:https://stackoverflow.com/questions/6122398/objective-c-why-private-ivars-are-not-hidden-from-the-outside-access-when-using


以上所述就是小编给大家介绍的《Objective-c:为什么在使用KVC时私人ivars不会被外部访问隐藏》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

高性能网站

高性能网站

(美)苏德 / 东南大学出版社 / 2008年 / 28.00元

《高性能网站》中的规則向你解释了可以怎样优化网站中包含的Ajax、CSS、JavaScript、Flash和图片。每个规则都可以在本书的网站上找到对应的特别例子和代码片段。这些规則包括以下内容:减少HTTP连接请求、使用内容分发网络(ContentDeliveryNetwork)、在HTTP协议头添加过期时间、把部分内容变成Gzip格式、把样式表(stylesheets)放在顶部、将脚本放在底部、......一起来看看 《高性能网站》 这本书的介绍吧!

HTML 压缩/解压工具
HTML 压缩/解压工具

在线压缩/解压 HTML 代码

JSON 在线解析
JSON 在线解析

在线 JSON 格式化工具

RGB HSV 转换
RGB HSV 转换

RGB HSV 互转工具