面试的时候被问到了一个关于 class method 的问题

2014-07-09 08:43:40 +08:00
 troyl
如何创建一个 class method 使得所有这个 class 的 instance 的某一 property 都被更新。
比方说,改掉所有 Label 的 default height
4574 次点击
所在节点    iDev
25 条回复
krafttuc
2014-07-09 13:48:33 +08:00
最容易想到的是通过 class variable 来实现。可惜,Objective-C 严格来说是不像 C++, Java 有那种 class variable 的特性。只有全局的 static variable,也就是 C-style 的那种全局变量。但我们仍然可以尝试用 class methods 来操纵这些 static variable。。。

接着用 instance methods,如各种 accessor (property就是一种)方法,来读这些个 static 变量,这样可以实现某种程度上的 property 更新了。


@Kjuly UIAppearance 在语义上是用于定制UI外观的,因此我不建议用在非UI层面的类上。此外,UIAppearance 的 + appearance 方法是返回一个实例吧?!接着在设置一些值时貌似在实例上操作,而非通过楼主题目所要求的 class methods 了?
Kjuly
2014-07-09 14:46:29 +08:00
@krafttuc 問題說簡單了就是創建一個實現統一更新指定參數的邏輯的Class Method 那把所有更新操作放在裏邊 比如|+updateToNightMode|.

至於「UIAppearance 在语义上是用于定制UI外观的」 沒錯 但請問在iOS開發上 除了UI需要統一更新外 還有什麼?哪怕很多邏輯參數上的更新 最後也是體現在UI/UX上 當然也肯定有特例 那麼就相應尋找其它解決方案

不多繼續討論這個問題了 我也是根據自己知道的推薦一個方法 ;)
zhigang1992
2014-07-10 09:42:05 +08:00
没人说到Objective-C的动态功能? 在+load里面把instance的method imp替换掉?比如height的getter?
dopcn
2014-07-10 14:00:44 +08:00
class method 里postNotification, instance method里addObserve
这个方法似乎更实际一些
将 class conform to UIAppearanceContainer 标记需要统一变动的 property 为 UI_APPEARANCE_SELECTOR,然后用 appearance 应该就可以改动所有了,但只是理论上可行
troyl
2014-07-10 14:28:12 +08:00
@dopcn 这个思路很不错诶!

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/121686

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX