iOS 代码精简的小技巧(**)

最近项目有精简代码的需求。
代码美观,耦合性地,这就要求我们尽可能的将一个类中的代码抽离出去,重新抽离在一个新的类中。但是在当前类中可能存在某些局部变量或者全局变量需要改变值,出现无法抽离到新的类中的情况,请看下面的情况。

①:在一个方法中改变局部变量的值
在这里插入图片描述
显然这样是无法改变 str 的值的。

那么这种情况 就可以使用 ()这个技能了。
在这里插入图片描述
这样用法的大概意思是 把 str 的变量的地址 提供给 changeValue 使用。在
changeValue** 方法中就可以通过地址来操作 这个局部变量了。

② 全局变量(**) 的使用

- (NSMutableDictionary *)parma{
    if (!_parma) {
        _parma = @{@"name":@"leihuai",@"age":@(18)};
    }
    return _parma;
}

如上面所示,定义了一个全局变量。 但是还是像上面那样使用全局变量就会出现报错。
Address of property expression requested
error:Address of property expression requested

显然对全局变量使用 &(取地址符)在OC中是不被允许的。

我们再来看下面用法
在这里插入图片描述
_value 这个全局变量是这样声明的。
在这里插入图片描述

通过比较我们发现 : 通过@property 方式定义的全局变量这样使用地址传递是不被允许的,因为 @property 声明的变量,编译器会默认生成该属性的set 和 get方法,当使用 “.” 调用该属性是,实际上是执行了相应的set和get方法,而不是对当前属性取地址。
那么如果非要对@property 修饰的全局变量使用 ”&“ 时,应该用如下方式。 &self->_parma
在这里插入图片描述

如上图所示,这样使用即可对使用 property 修饰的全局变量,但是这里出现了一个报错:Passing address of non-local object to __autoreleasing parameter for write-back 这个报错 翻译过来是:将非本地对象的地址传递给剩余的自动释放参数,以便回写 大概意思是 全局变量形参的地址传递,会导致 引用计数混乱,因此这里需要 对 方法中的形参,使用 __strong 修饰,如下图:
在这里插入图片描述
经 __strong 修饰后,就不报上面那样的错误了。但是 经过方法后,parma 的值却没有发生改变。这也简单, 使用 self->_parma 并没有触发懒加载。也就没有 对 parma 进行初始化,没有分配地址。

在这里插入图片描述

这样就可以了, 使用地址传递就是这样了, 不管是在同一个类还是在不同类中,都可以这样操作。 方便抽离代码,给app瘦身。

我是磊怀: 2849765859 qq

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章