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

2014-07-09 08:43:40 +08:00
 troyl
如何创建一个 class method 使得所有这个 class 的 instance 的某一 property 都被更新。
比方说,改掉所有 Label 的 default height
4569 次点击
所在节点    iDev
25 条回复
ledkk
2014-07-09 09:26:58 +08:00
把自己的实例放到一个类变量上, 修改属性的类方法,就是遍历所以的类实例,然后修改属性
fgwww
2014-07-09 09:57:32 +08:00
做成单例
bbiao
2014-07-09 10:13:07 +08:00
有没有设定语言背影?
C++?
JavaScript?
troyl
2014-07-09 10:13:43 +08:00
@bbiao 这里不是 iDev 么?当然是 Objective-C 啊
bbiao
2014-07-09 10:15:04 +08:00
@troyl 好吧,我在首页上看到的问题,没注意版块。
troyl
2014-07-09 10:15:57 +08:00
@bbiao :)
hoogle
2014-07-09 10:25:40 +08:00
用通知会比较方便
troyl
2014-07-09 10:26:57 +08:00
@hoogle 已经强制要求要用 class method 了……
nagato
2014-07-09 10:33:08 +08:00
initWithHeight: ?
troyl
2014-07-09 10:50:20 +08:00
@nagato 那是创建一个新的 instance 的时候 height 会改变,已有的不会变啊。
Kjuly
2014-07-09 10:52:22 +08:00
hoogle
2014-07-09 11:13:07 +08:00
@troyl class method 里postNotification, instance method里addObserve。。
nekop
2014-07-09 11:14:44 +08:00
事先有保存改类的所有实例吗?
zichen0422
2014-07-09 11:23:53 +08:00
猜测一下 没有实现过 如有错误 请无视

class_copyPropertyList 这个可以获取类的属性
class method 方法去遍历类的属性 uilabel的就对其改变height。
icyalala
2014-07-09 11:26:25 +08:00
@Kjuly 这个太局限了吧~

对于不能接触源码的类、难以子类化的类簇,我感觉可以这样,具体行不行还没试:
创建个Category,写上+load方法,然后里面用method swizzling去拦截类创建的方法,或者去拦截那个property的访问方法,之后用proxy或者notification之类的机制去实现更新动作。


如果能子类化、或者能接触源码,那就很简单了。最简单的方法就是修改init之类的创建方法,在实例创建后把它添加到一个全局的Array里,dealloc时从全局Array里移除,这样就能得到当前类的全部实例了。当然用notification什么的也都可以了。
Kjuly
2014-07-09 11:39:58 +08:00
@icyalala "UIAppearance is a protocol that returns a proxy that will forward any configuration to instances of a particular class."

- |+appearance|: Returns the appearance proxy for the receiver.
- |+appearanceWhenContainedIn:(Class <UIAppearanceContainer>)ContainerClass,...|: Returns the appearance proxy for the receiver in a given containment hierarchy.

對於問題足夠了,不用做多餘的hack ;)
troyl
2014-07-09 11:48:52 +08:00
@Kjuly 那个 UILabel 只是打个比方……如果是其他 custom 的 class 呢?
troyl
2014-07-09 12:02:55 +08:00
@icyalala 按照面试官的意思是可以接触源码的。但是如果改 initializer 然后储存所有的 instance 到一个 NSArray,之后再遍历修改所有的 height 值似乎有点笨……我的意思是能不能搞一个全局变量,然后在 initializer 里把所有的 height property 都指向这个全局变量,然后想修改的话就修改这个全局变量就行了。
Kjuly
2014-07-09 12:16:01 +08:00
@troyl 任意class的property.
Kjuly
2014-07-09 12:17:22 +08:00

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

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

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

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

© 2021 V2EX