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

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