首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

在类扩展或@implementation块中添加伪私有ivars有什么区别?

在Objective-C中,类扩展(class extension)和@implementation块是两种不同的方法来扩展类的功能。它们之间的主要区别在于扩展的范围和可见性。

  1. 类扩展(class extension): 类扩展是一种声明类的扩展,它允许你在接口中添加属性和方法,而不需要在主接口中声明它们。类扩展的主要目的是为了实现封装和隐藏实现细节。类扩展的语法如下:
代码语言:txt
复制
@interface ClassName ()

@property (nonatomic, strong) NSArray *array;

@end
  1. @implementation块: @implementation块是实现类的方法和属性的地方。在@implementation块中,你可以添加实例变量(ivars),这些变量可以在类的所有实例方法中访问。实现块的语法如下:
代码语言:txt
复制
@implementation ClassName

@synthesize array;

@end

在类扩展或@implementation块中添加伪私有ivars的区别:

  1. 类扩展中的伪私有ivars: 在类扩展中添加的属性只能在类的内部访问,而不能在类的外部访问。这样可以实现封装和隐藏实现细节。这些属性在类的实现块中不需要进行@synthesize声明,编译器会自动为你生成。
  2. @implementation块中的伪私有ivars: 在@implementation块中添加的实例变量可以在类的所有实例方法中访问,但它们也可以在类的外部访问。这意味着它们不是真正的私有变量,但可以作为伪私有变量使用。要在@implementation块中添加伪私有ivars,你需要使用@synthesize声明。

总结:

在类扩展中添加伪私有ivars可以实现真正的私有变量,而在@implementation块中添加伪私有ivars可以实现类似私有变量的功能。在实际开发中,你可以根据需要选择使用哪种方法。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

iOS进阶之runtime作用

2、作用 1.动态交换两个方法的实现 2.为类别添加属性(我们知道类别是不能扩展属性的,只能扩展方法,但可以运行时实现,通过为增加属性) 3.获取某个的所有成员变量和成员方法 4.实现NSCoding...3、详解: 一、动态交换方法 1.自定义DWExchangeTwoMethod.m - (instancetype)init { if (self = [super init]) {...返回的仅仅是对象的属性(@property申明的属性),而class_copyIvarList返回的所有属性和变量(包括@interface大括号声明的变量) 四、实现NSCoding的自动归档和自动解档...,所以我们添加个分类会更加简化 #import "NSObject+ArchiveExtension.h" #import @implementation NSObject...); c = [c superclass]; } } @end 这时,可以DWPerson.m取代之前的代码 - (void)encodeWithCoder:(NSCoder

63290
  • iOS_Extension、Category、load、initialize

    在编译时,其数据就包含在信息;Category在运行时,才会将数据合并到信息 Extension不能像Category那样拥有独立的**@implementation部分。...也就是说Extension声明的方法必须依托对应的@implementation**部分实现。 2、为什么Category可以添加属性和方法,却不能添加成员变量?...虽然说runtime一个 lass_addIvar() 添加成员变量的方法,但是只能在“构建一个的过程”调用。一但完成定义,就不能再添加成员变量了。...Categoryload方法,load方法程序启动装载信息的时候(main函数之前,初始化runtime之后)调用,仅调用一次。...为了安全起见,load实现method swizzling也要做唯一性判断:(如:防止子类调用[super load]的情况) + (void)load { static dispatch_once_t

    51100

    Objective-C Runtime 的一些基本使用

    上篇文章 的 Property 我们也提到了获取的属性的方法,如下: id LenderClass = objc_getClass("ClassA");//获取classA 的元,不同于[...获取的成员变量 我们可以发现获取的方法,属性过程基本一致:通过元获取方法列表属性列表,然后进行遍历。...编译错误,提示实例变量无法添加到分类,用正常的方法确实无法分类添加属性。 但是可以通过Runtim机制进行“添加”。其本质是给这个添加属性关联,而非把这个属性添加。...objc_removeAssociatedObjects() 移除关联 我们使用上面的获取属性和成员变量的方法,发现输出: // 属性输出 propertyName:name propertyAttributes...():取代了对于一个给定的的实现方法 method_exchangeImplementations():交换两个的实现方法 这里我们先使用 class_addMethod() 添加方法,若返回

    1.2K80

    class_ro_t 的探索

    WWDC2020一个视频讲的是关于Objective—C 在运行时的一些优化,本篇文章是对视频中讲到的的部分知识点进行探索。...添加协议,再运行看看。...二、class_ro_t 的 ivars 我们先来看一下class_ro_t 的 ivars 中都有什么: 确实有 SHPerson 的四个成员变量,那如果我们分类添加属性或者成员变量,class_ro_t...可以看到分类添加实例变量语法都不过,那我们只能添加属性了,但其实大概也能猜出来添加属性就算语法过了,class_ro_t 也不会存储。先来验证一下吧。...分类添加属性还要求添加相对应的 getter 和 setter。 准备好了之后,我们来验证一下: 并没有 height 属性,我们的猜想正确!

    40310

    Objective-C Runtime 详解

    而最新版的 Runtime 源码对这一的描述已经很大变化,可以参考下美团技术团队的深入理解Objective-C:Category....PS:任性的话可以Category添加@dynamic的属性,并利用运行期动态提供存取方法干脆动态转发;或者干脆使用关联度对象(AssociatedObject) 其中objc_ivar_list...在编译我们的时,编译器生成了一个 ivar 布局,显示了从哪可以访问我们的 ivars 。 我们对 ivar 的访问就可以通过 对象地址 + ivar偏移字节的方法。...但此时获取的属性名是不带下划线的,得到属性或者变量名后我们就可以使用KVC去修改访问私有属性变量。所以OC没有真正意义上的私有变量,私有方法也是。...健壮的实例变量下编译器生成的实例变量布局跟以前一样,但是当 runtime 系统检测到与超部分重叠时它会调整你新添加的实例变量的位移,那样你子类中新添加的成员就被保护起来了 需要注意的是健壮的实例变量下

    1.2K20

    Objective-C Runtime详解

    而最新版的 Runtime 源码对这一的描述已经很大变化,可以参考下美团技术团队的深入理解Objective-C:Category....PS:任性的话可以Category添加@dynamic的属性,并利用运行期动态提供存取方法干脆动态转发;或者干脆使用关联度对象(AssociatedObject) 其中objc_ivar_list...在编译我们的时,编译器生成了一个 ivar 布局,显示了从哪可以访问我们的 ivars 。 我们对 ivar 的访问就可以通过 对象地址 + ivar偏移字节的方法。...但此时获取的属性名是不带下划线的,得到属性或者变量名后我们就可以使用KVC去修改访问私有属性变量。所以OC没有真正意义上的私有变量,私有方法也是。...健壮的实例变量下编译器生成的实例变量布局跟以前一样,但是当 runtime 系统检测到与超部分重叠时它会调整你新添加的实例变量的位移,那样你子类中新添加的成员就被保护起来了 需要注意的是健壮的实例变量下

    1.7K60

    OC最实用的runtime总结,面试、工作你看我就足够了!前言什么是runtime?如何应用运行时?

    method_exchangeImplementations(Method m1 , Method m2) 案例1:方法简单的交换 创建一个Person实现以下两个方法,并在.h 文件声明...步骤: 1、为UIImage建一个分类(UIImage+Category) 2、分类实现一个自定义方法,方法写要在系统方法中加入的语句,比如版本判断 + (UIImage *)xh_imageNamed...利用以上思路,我们还可以给 NSObject 添加分类,统计创建了多少个对象,给控制器添加分类,统计有创建了多少个控制器,特别是公司需求总变的时候,一些原有控件模块上添加一个功能,建议使用该方法!...二、分类设置属性,给任何一个对象设置属性 众所周知,分类是无法设置属性的,如果在分类的声明写@property 只能为其生成get 和 set 方法的声明,但无法生成成员变量,就是虽然点语法能调用出来...runtime的ivar_getTypeEncoding 方法获取模型对象类型,对该模型对象类型再进行字典转模型,也就是进行递归,需要注意的是我们要排除系统的对象类型,例如NSString,下面的方法添加了一个方法方便递归

    1.3K120

    KVO详解及底层实现

    正式协议吗?? 麻蛋,本来想找官方文档的,找了半天没找到。...),非正式协议的方法是可选的 正式协议: 一个正式协议声明了需要实现的方法列表,正式协议自己的声明、采用和类型检查语法。...KVO底层实现探究 首先,我们利用runtime添加监听之前和之后分别打印一下对象 NSLog(@"%@", object_getClass(self.person)); [self.person...同样添加监听方法之前,利用runtime打印下方法的实现,截图如下: 发现方法实现变了,内部调用了系统Foundation框架下的_NSSetObjectValueAndNotify方法。...v表示方法返回值void 第二三个@:一般是一的,因为函数至少有两个参数self和_cmd,一般是固定写法 最后一个@表示参数类型,是一个对象 下面代码实验,看下我们自己写的kvo有没有执行: 修改添加监听者的方法

    2.3K20

    OC史上最实用的runtime总结,面试、工作你看我就足够了

    method_exchangeImplementations(Method m1 , Method m2) 案例1:方法简单的交换 创建一个Person实现以下两个方法,并在.h 文件声明...步骤: 1、为UIImage建一个分类(UIImage+Category) 2、分类实现一个自定义方法,方法写要在系统方法中加入的语句,比如版本判断 + (UIImage *)xh_imageNamed...利用以上思路,我们还可以给 NSObject 添加分类,统计创建了多少个对象,给控制器添加分类,统计有创建了多少个控制器,特别是公司需求总变的时候,一些原有控件模块上添加一个功能,建议使用该方法!...二、分类设置属性,给任何一个对象设置属性 众所周知,分类是无法设置属性的,如果在分类的声明写@property 只能为其生成get 和 set 方法的声明,但无法生成成员变量,就是虽然点语法能调用出来...runtime的ivar_getTypeEncoding 方法获取模型对象类型,对该模型对象类型再进行字典转模型,也就是进行递归,需要注意的是我们要排除系统的对象类型,例如NSString,下面的方法添加了一个方法方便递归

    1.5K20

    Android仿新版微信浮窗效果

    阅读公众号其他文章,经常需要暂时退出文章. 新版微信中,可以把浏览的文章缩小为浮窗.点击浮窗继续阅读.对于经常在微信里阅读的人来说,这简直就是人类之光. 微信效果如下 ?...简单写了一个库,一句代码即可实现效果 github.com/SherlockQi/… //AppDelegate中将名传入即可 [HKFloatManager addFloatVcs:@[@"HKSecondViewController...#import “HKFloatManager.h” //AppDelegate中将名传入即可,该类控制器侧滑返回时启动浮窗功能(需要在实例化导航控制器之后) [HKFloatManager...hk_currentTabBarController { return [self hk_currentViewController].tabBarController; } @end 判断控制器是否”...); return have; } 以上便是实现该效果的全部实现.上方含有部分代码.全部代码已上传至—Github— 欢迎(跪求) Star.

    93020

    关于NSObject对象的内存布局,看我就够了!

    仔细想一下,实例对象创建的时候,系统应该就会分配对应的内存空间,那咱继续探究一下,在对象初始化的过程,是否对应的内存分配呢?...计算机,内存大小的基本单位是字节,理论上来讲,可以从任意地址访问某种基本数据类型。 但是实际上,计算机并非按照字节大小读写内存,而是以2、4、8的倍数的字节来读写内存。...结构体声明的时候添加上述的代码指令,如下所示: #pragma pack(1) /*1字节对齐*/ struct object { int a; // 4 char b; // 1...例如,当字节对齐变化时,需要填充的字节数可能就会发生变化。 小结 真正的开发过程,我们不用过多关注字节对齐的问题,编译器会帮我们处理好。...Animal_IMPL结构体,占用内存最大的成员变量是NSObject_IVARS,占用的内存是8个字节。

    1.8K20

    利用runtime进行归档解档

    说实话,本人在项目中并不是很常用归档来进行数据的本地存储。今天之所以写这篇博客是因为最近了解到原来我们还能利用runtime进行归档和解档。...先来看一下我们之前的归档、解档代码: 例如我们要对Person这个拥有name和age属性的的某个对象进行归档,其中Person的代码: #import "Person.h" @interface...如果某个的属性特别多,假设Person这个十个属性,那么我们利用之前的方式,Person的代码就会很多而且都是一些重复的代码。...而我们使用runtime之后不管我们要进行归档的某个多少个属性,这个的代码都是一样的多。...解读利用runtime归档Person的代码: 利用runtime的某些方法我们获取某个的所有属性个数以及属性名称,然后利用了for循环对的所有属性进行归档、解档的操作。

    40120

    RuntimeiOS开发的实际应用

    1 关联对象(AssociatedObject ) Catagory主要为已经存在的(主要是系统)扩展新的方法,关联对象是runtime开发应用的最广泛,其主要用于为Catagory的对象增加属性...,方法,甚至可以实现协议,添加属性,不可以添加成员变量。...主要因为方法定义都在objc_class管理的,不管如何增删方法,都不影响实例的内存布局,创建一个对象必然会分配一内存区域,包含了isa指针和所有的成员变量。...能保证的初始化过程中被加载。...处理用户登录 5.4Crash的防范 OC容器空值nil 和数组越界都会直接导致我们app 的crash 我们一种处理方式是利用Category增加新方法判断值是否为空或者越界,对于新工程我们使用大家约定使用容器的

    1K20

    iOS - 实现UINavigation全屏滑动返回(二)

    回顾 iOS - 实现UINavigation全屏滑�动返回(一) 我们实现了滑动返回的功能,但不是全屏滑动返回,得左侧边缘轻扫才能滑动返回~UINavigationController自带的只能在边缘轻扫才能滑动返回...提供的方法我们可以推断出一定有target,而且还是强引用的私有属性!...机制 // 只能动态获取当前的成员属性,不能获取其子类,或者父的属性 unsigned int count = 0;// 拷贝出所胡的成员变量列表 Ivar *ivars = class_copyIvarList...); 在打印我们找到了UIGestureRecognizer的私有属性 _targets,是个数组,而且只有一个元素,元素的类型如图所示 ?...initWithTarget:self action:@selector(pan)]; [self.view addGestureRecognizer:myPan]; myPan.delegate = self; 我们添加手势时设置了

    1.2K40

    KVC 使用方法详解及底层实现你要知道的KVC、KVO、Delegate、Notification都在这里

    ,因此,经常在开发通过runtime获取相关属性名后使用KVC来修改那些只读readonly隐藏的属性。...如果没有setter方法,寻找_(key属性名),这里是_name成员变量,无视该成员变量的访问修饰符,也无视该成员变量是@interface的接口部分定义的还是@implementation实现部分定义的...自定义实现了valueForUndefinedKey:和setValue:forUndefinedKey:方法,如果不实现该方法设置不存在的key时默认抛出异常,实际开发通常需要从服务端获取大量的...实际开发还遇到过一种情况,iOS端的对象使用NSString类型存储用户ID,但服务端返回的是int类型的数据,赋值时就会崩溃,解决该问题需要我们自己实现setValue:forKey:方法,该方法判断...修改后的效果 我们需要修改系统提供UI界面而又束手无策时可以使用runtime获取属性来查看是否可以使用的属性方法,接着可以使用KVC获取相关值进行赋值操作,这种方法可能也会存在风险,如果获取的是苹果禁用的私有

    1.3K70
    领券