美文网首页iOS面试剖析
私有变量和私有方法的访问

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

作者: 滨滨_57b5 | 来源:发表于2019-02-13 17:17 被阅读0次

OC中没有绝对的私有变量和私有方法

  • 对于私有变量,例如在.h文件中使用@private修饰的变量;在.m文件中扩展中声明的变量和属性和方法默认都是@private私有的
  • 对于私有方法,在.h文件中没有声明,在.m文件中只做了实现的方法是私有的

看上去这些变量属性和方法都是私有的,实际可以通过一些手段强制进行访问,因此OC中没有绝对的私有

私有变量强制访问

.h文件
#import <Foundation/Foundation.h>

@interface TestObject : NSObject
{
    @private
    NSString *major;//私有成员变量
}

@end

.m文件
@interface TestObject()
{
    int age;//私有成员变量
}
@property (nonatomic,copy)NSString *name;//私有属性
@end
@implementation TestObject

- (void)test {//私有方法
    NSLog(@"这是一个私有方法");
}
@end
> 方式一:通过kvc强制访问私有属性和成员变量
  TestObject *test = [[TestObject alloc]init];
  [test setValue:@"albert" forKeyPath:@"name"];
  NSString *name = [test valueForKey:@"name"];   
  NSLog(@"%@",name);
> 方式二:通过runtime强制访问私有属性和成员变量
    TestObject *test = [[TestObject alloc]init];
    unsigned int count = 0;
    Ivar *members = class_copyIvarList([TestObject class], &count);
    Ivar varName = members[3];
    Ivar varMajor = members[0];
    object_setIvar(test, varName, @"binbin");
    object_setIvar(test, varMajor, @"shuoshuo");
    NSString *name = object_getIvar(test, varName);
    NSLog(@"%@",name);
    free(members);

私有方法强制访问

   TestObject *test = [[TestObject alloc]init];
   unsigned int count = 0;
   Method *methods = class_copyMethodList([TestObject class], &count);
   SEL sel = method_getName(methods[0]);
   [test performSelector:sel];

⚠️[test performSelector:sel];此句代码会报警告,警告调用了一个未知的方法

image.png
❗️那么如何消除这个警告,此处就需要使用分类的一个作用,即分类可以创建对私有方法的前向引用
创建分类,并在.h文件中将宿主类的私有方法声明在这里
.h文件
#import "TestObject.h"

NS_ASSUME_NONNULL_BEGIN

@interface TestObject (Category)

- (void)testMethod;

@end

NS_ASSUME_NONNULL_END


.m文件中不用做任何实现

此时在其他文件中引用分类.h文件和宿主类.h文件,然后直接调用私有方法即可
 
  TestObject *test = [[TestObject alloc]init];
  [test testMethod];

相关文章

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

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

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

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

  • Javascript 面向对象(共有方法,私有方法,特权方法,静

    一,私有属性和方法 私有方法:私有方法本身是可以访问类内部的所有属性(即私有属性和公有属性),但是私有方法是不可以...

  • 2017-5-26

    1.面向对象,私有方法,私有属性,魔法方法,私有变量通过方法被访问从而被封装2.对象的传递3.del引用计数的缩减...

  • ActionScript3.0基础(一)

    访问控制属性: public:公有属性 private:私有类型的变量和方法只允许定义它们的类访问,其他类访问报错...

  • JavaScript函数表达式——私有变量

    私有变量 任何在函数中定义的变量,都可以认为是私有变量,因为不能在函数的外部访问这些变量,私有变量包括函数的参数,...

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

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

  • iOS知识点总结

    一、Object-C中变量默认是私有的吗,方法默认是私有的吗? Object-C中既有私有方法,也有私有变量。 1...

  • 公有、私有、静态属性和方法的区别2018-07-10

    //私有方法:私有方法本身是可以访问类内部的所有属性(即私有属性和公有属性),但是私有方法是不可以在类的外部被调用...

  • class 中的 getters 和 setter

    想在类的外部访问私有变量我们可以使用 getter 方法,用 get 关键字声明: 演示: 同样的想在外部修改私有...

网友评论

    本文标题:私有变量和私有方法的访问

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