假设(为了参数)我有一个包含NSDictionary的视图类.我想要一大堆属性,所有属性都可以访问该字典的成员.
例如,我想@property NSString* title
和@property NSString* author
.
对于这些属性中的每一个,实现都是相同的:对于getter,call [dictionary objectForKey:propertyName];
和setter,对setObject:forKey:执行相同的操作.
这需要花费大量时间并使用大量的复制粘贴代码来编写所有这些方法.有没有办法自动生成它们,就像Core Data使用NSManagedObject子类的@dynamic属性一样?为了清楚起见,我只希望这种方法可以访问我在标题中定义的属性,而不仅仅是任意键.
我遇到过valueForUndefinedKey:作为键值编码的一部分,它可以处理getter,但我不完全确定这是否是最好的方法.
我需要这些是显式属性,所以我可以在Interface Builder中绑定它们:我最终计划为这个视图编写一个IB调色板.
(顺便说一句,我知道我使用NSDictionary来存储这些的例子有点人为.我实际上是在编写WebView的子类,属性将引用HTML元素的ID,但这对我的问题的逻辑并不重要!)
Objective-C因其在Mac OS X和iPhone开发中的使用而得到越来越广泛的应用.Objective-C语言中您最喜欢的"隐藏"功能有哪些?
据我所知,Objective C/iOS是非常动态的语言,它是否像Ruby一样动态?它是否具有method_missing的等价物?我问同样的问题js Javascript是否有像Ruby的method_missing功能?并且对js不支持它感到失望.
我知道iOS Runtime很强大,我有一个问题:我们应该在哪里使用运行时?
例如,我发现许多文章将讨论类和方法的混合.在哪种情况下我应该使用它?
我也谷歌它发现它被广泛用于越狱开发.但是,我是一个非越狱的开发者,请不要越狱〜
谢谢!
我正在尝试动态地(在运行时)将一个方法调用转换为另一个方法调用.
例如,我想要以下内容:
[obj foo]
Run Code Online (Sandbox Code Playgroud)
委托:
[obj getAttribute: @"foo"]
Run Code Online (Sandbox Code Playgroud)
(我想动态地这样做,因为我事先不知道这些方法名称或属性是什么).
我看到有一个钩子:
- (id) forwardingTargetForSelector: (SEL) aSelector
Run Code Online (Sandbox Code Playgroud)
但是,这似乎只适用于委托,我希望将对象保持为"self"并转换方法参数.
我应该在哪里寻找这种行为?在obj-c中甚至可能吗?
我是客观C的新手,从C/C++背景来看,我正在努力去理解客观C的动态.
请考虑以下代码:
id someObject = @"Hello, World!";
[someObject removeAllObjects];
Run Code Online (Sandbox Code Playgroud)
在这种情况下,someObject
将指向一个NSString
实例,但除了它是某种对象之外,编译器对该实例一无所知.所述removeAllObjects
消息是由一些可可或可可触摸对象(如定义的NSMutableArray
),从而,编译器不抱怨,即使该代码将在运行时生成异常,因为一个NSString对象无法removeAllObjects响应.
removeAllObjects消息由一些Cocoa或Cocoa Touch对象(例如NSMutableArray)定义,因此编译器不会抱怨.
这是否意味着,运行时实际上会查找所有实现的方法?如果是,它是否会影响性能?
请提出我的理解是否错误.
谢谢.
objective-c ×6
iphone ×3
cocoa ×2
dynamic ×2
ios ×2
delegation ×1
macos ×1
reflection ×1
runtime ×1