类扩展中声明的变量是否为强引用?该写法是否合规?
类扩展中实例变量的引用类型与写法答疑
嘿,这两个问题我给你讲得明明白白的:
1. 类扩展里声明的变量是不是都是强引用?
得分两种情况来看:
- 对于对象类型的变量(比如你写的
UILabel *timeLabel):OC里默认的实例变量都是强引用(strong),不管是在类扩展的大括号里,还是类的主@interface块里声明的,只要没显式加__weak、__unsafe_unretained这类修饰符,都是强引用。 - 对于基本数据类型(比如
BOOL isNewUI):这类是值类型,不存在引用计数的概念,所以没有强弱引用的说法,直接存储值就行。
如果想改变对象变量的引用类型,直接加修饰符就行,比如想让timeLabel是弱引用:
@interface ClassA () { __weak UILabel *timeLabel; BOOL isNewUI; } @end
2. 你贴的写法可行吗?
完全没问题!这种在类扩展的大括号里声明实例变量的写法非常常用:
- 类扩展里的这些变量是类的私有成员,只能在当前类的
@implementation里访问,外部类(包括子类)都无法直接访问,刚好用来封装类内部的状态,避免把不必要的细节暴露给外部。 - 这种写法和在类的主@interface里声明实例变量的语法逻辑一致,只是作用域被限制在了类内部。
内容的提问来源于stack exchange,提问作者Sivrish Thangamani
相关产品推荐
相关产品推荐

