美文网首页
iOS | OC有真正的私有变量和私有方法么

iOS | OC有真正的私有变量和私有方法么

作者: 颜小宋 | 来源:发表于2019-09-25 15:55 被阅读0次

首先,私有的定义:是指只能够在本类内部使用或访问,但是不能在类的外部被访问。
但oc是动态性语言,它的对象类型和要调用的方法都是再运行中才能确定的,也就决定了在oc中没有绝对的私有变量和私有方法的

访问私有变量
1、在知道变量名称时,可以通过kvc来直接访问和改变私有变量
2、通过runtime获得所有的成员变量列表

下面我们来验证下

#import "Person.h"

@interface Person (){
    @private
    NSString *name;
    NSString *sex;
}
@end

@implementation Person

- (void)test{
    NSLog(@"私有方法");
}

@end

调用

  //1、通过kvc访问
  Person *person = [[Person alloc] init];
  [person setValue:@"krys" forKey:@"name"];
  [person setValue:@"男" forKey:@"sex"];
  NSLog(@"name = %@,sex = %@",[person valueForKey:@"name"],[person valueForKey:@"sex"]);
    
  //2、通过runtime访问
  unsigned int outCount = 0;
  Ivar *ivars =class_copyIvarList([Person class], &outCount);
  for (int i = 0; i < outCount; i++) {
       Ivar ivar = ivars[i];
       NSString *key = [NSString stringWithUTF8String:ivar_getName(ivar)];
       NSString *value = object_getIvar(person, ivar);
       NSLog(@"key = %@,value = %@",key,value);
  }

打印出的结果

2019-09-25 15:24:51.544623+0800 Demo[22831:5169456] name = krys,sex = 男
2019-09-25 15:24:51.544694+0800 Demo[22831:5169456] key = name,value = krys
2019-09-25 15:24:51.544731+0800 Demo[22831:5169456] key = sex,value = 男

那么访问私有方法呢
1、在知道方法的名称以及参数的前提下通过performSelector系列方法访问
2、通过runtime获取方法列表
3、使用category,上面的Person类中test方法为例,给Person增加个category,若category声明的方法和Person类中方法名相同,且category并未实现此方法,则会去类里查找这个方法调用

我们同样用上面的Person类来验证

//1、通过performSelector
Class c = NSClassFromString(@"Person");
NSObject *obj = [[c alloc] init];
SEL method = NSSelectorFromString(@"test");
[obj performSelector:method withObject:nil afterDelay:YES];
    
//2、通过runtime
Method *methods = class_copyMethodList([Person class], &outCount);
for (int i = 0; i < outCount; i++) {
      Method method = methods[i];
      SEL methodSel = method_getName(method);
      NSString *sel = [NSString stringWithCString:methodSel encoding:NSUTF8StringEncoding];
      NSLog(@"sel = %@",sel);
}

打印出的结果

2019-09-25 15:34:21.881038+0800 Demo[22834:5170995] 私有方法
2019-09-25 15:44:28.663878+0800 Demo[22846:5173445] sel = test

以上,我们自然可以得出自己的结论了

相关文章

  • iOS | OC有真正的私有变量和私有方法么

    首先,私有的定义:是指只能够在本类内部使用或访问,但是不能在类的外部被访问。但oc是动态性语言,它的对象类型和要调...

  • objective-c访问私有变量

    oc没有真正的私有变量,私有方法。通过骗过编译器,我们可以获取我们想要的变量或方法,本文主要记录oc继承中,如何访...

  • 私有变量和私有方法的访问

    OC中没有绝对的私有变量和私有方法对于私有变量,例如在.h文件中使用@private修饰的变量;在.m文件中扩展中...

  • 关于 OC基础语法(初级)

    整理一些笔试面试题,基础的。 1 OC中是否私有方法和私有成员变量? 先表明下观点:没有绝对的私有变量和方法。如果...

  • 1.1 OC中的私有方法

    本小节知识点: 【掌握】OC中的私有变量 【掌握】OC中的私有方法 1.OC中的私有变量 在类的实现即.m文件中也...

  • iOS 利用runTime进行“私有方法”替换

    写在前面 首先声明:题目中所说的“私有方法”只是我们感官上的感觉,OC 中没有绝对的私有变量和私有方法。 关于私有...

  • 牛客网 iOS 题 21-41

    牛客网 iOS 题 21-41 21.Objective-C 有私有方法吗?有私有变量吗? 答案: 没有私有方法,...

  • 精通掌握封装,多态,继承。

    精通掌握封装,多态,继承。①对于封装:OC没有私有方法但有一定意义上的私有变量,自己类的私有方法可 ...

  • 私有变量(上)

    // 如果只有方法的实现, 没有方法的声明, 那么该方法就是私有方法 // 在OC中没有真正的私有方法, 因为OC...

  • 2018-06-28 python 类的私有变量和私有方法

    转发python 类的私有变量和私有方法 类的私有变量和私有方法在Python中可以通过在属性变量名前加上双下划线...

网友评论

      本文标题:iOS | OC有真正的私有变量和私有方法么

      本文链接:https://www.haomeiwen.com/subject/mwmiuctx.html