objective-c-runtime相关内容
如果我在这样的随机课程中打过电话: @implementation SomeClass - (void) classMethodFoo { int a = [SomeSingleton sharedInstance].aValue; } @end 在SomeSingleton sharedInstance内部,是否有一种方法可以获取对调用此方法的对象的引用(当然,不将调用的传
..
我在理解“选择器"功能的一部分时遇到了问题,如Apple指南中所述.我已经加粗了让我感到困惑的部分: 在Objective-C中,选择器有两个含义.可以用来参考 只是在源代码消息中使用方法的名称时 到一个对象. 尽管如此,它也指的是 编译源代码时替换名称.已编译 选择器的类型为SEL. 所有同名方法都具有 相同的选择器. 对象-这为实施该对象提供了基础 可可中的目标动作设计模式. 方法
..
是我上一个问题的跟进: ObjC方法类型编码中的数字是什么字符串? 说有一个编码: v24@0:4:8@12B16@20 这些数字如何计算? B是一个字符,因此它应该仅占据1个字节(而不是4个字节).它与“对齐"有关吗? void的大小是多少? 按以下方式计算数字是否正确?在每个项目上询问sizeof并将结果四舍五入到4的倍数?而第一个数字成为所有其他数字的总和吗? 解
..
Swift类是否具有可以重新映射的isa指针之类的东西? 我们已经看到,Swift 使用的是比Objective-C更静态的方法分派,该方法(除非有类服务) (来自Foundation/NSObject)),可以防止基于运行时重新映射方法实现的混淆样式. 我想知道我们如何实现基于方法拦截的动态功能,例如观察者模式,通知等?目前,所有这些东西都是由Objective-C层提供的,可以轻松
..
如果object_getIvar中的变量是基本数据类型(例如float,int,bool),那么根据文档,该函数返回指针(id)时如何获取值.我已经尝试过将类型转换为int *,但是当我尝试将其转换为NSLog时,出现关于不兼容的指针类型的错误. 解决方案 获取: myFloat = 2.34f; float myFloatValue; object_getInstanceVari
..
我有object_getInstanceVariable作为float myFloatValue; float someFloat = 2.123f; object_getInstanceVariable(self, "someFloat", (void*)&myFloatValue); 有效,并且myFloatValue = 2.123 但是当我尝试 double myDoub
..
我知道OBJC_ASSOCIATION_ASSIGN存在,但是如果取消分配目标对象,是否会将引用归零?还是就像过去需要删除该参考文献的旧时代一样,否则我们以后可能会有访问不当的风险? 解决方案 尝试后,答案是否定的. 我在iOS 6模拟器下运行了以下代码,但是它可能与运行时的先前迭代具有相同的行为: NSObject *test1 = [NSObject new]; NSOb
..
我在单元测试中创建了一堆简单的NSManagedObject.它们仅具有类型为NSString *的单个name属性.我总是给我NSManagedObject相同的entityName和Class名称. 我要避免必须编写30次以下代码来设置单元测试: @interface FooTest : GHTestCase { Foo *foo; } @end @implementation F
..
要在Swift中具有关联的对象,您只需使用内存地址作为句柄,然后使用objc调用即可. 您可以在所有地方使用google的常见示例代码是: var keyA:UInt8 = 0 var keyB:UInt8 = 0 extension UIViewController { var aoAA: String? { get { return objc_getAss
..
我有一个返回CGSize的类方法,我想通过Objective-C运行时函数调用它,因为我将类和方法的名称指定为字符串值. 我正在XCode 4.2中使用ARC标志进行编译. 方法签名: +(CGSize)contentSize:(NSString *)text; 我尝试做的第一件事是像这样用objc_msgSend调用它: Class clazz = NSClassFr
..
现代(64位OS X和iPhone OS)Objective C运行时的功能之一是属性可以动态合成ivars,而无需在类中明确声明它们的功能: @interface MyClass : NSObject { // NSString *name; unnecessary on modern runtimes } @property (retain) NSStrng *name; @end
..
使用关联对象时,可从iOS 4和OSX 10.6开始使用Objective-C运行时功能,有必要定义一个用于在运行时存储和检索对象的键. 典型用法是定义密钥,如下所示 static char const * const ObjectTagKey = "ObjectTag"; 然后使用来存储对象 objc_setAssociatedObject(self, ObjectTagK
..
我知道声明的属性会生成访问器方法,该方法有时只是语法糖. 我发现很多人在dealloc方法中使用self.property = nil. 1)在Apple的内存管理文档中,p23 它说: 您不应该使用访问器方法设置实例变量的唯一地方是init方法和dealloc. 为什么不应该呢? 2)在苹果公司的 Objective-C 2.0 中,p74 已声明的属性从根本
..
当前在Objective-C中使用方法swizzling进行实验,我有一个问题.我试图了解解决方法的正确方法,并且在网上研究后偶然发现了NSHipster的这一帖子: http://nshipster.com/method-swizzling/ 在帖子中,作者提供了一些使示例代码混乱的方法.我正在寻找可以更好地向我解释作者正在做什么的人.尤其是我对didAddMethod逻辑感到困惑.为什么
..
Objective-C中的选择器是否只是向对象发送消息的另一种方式?我真的不明白为什么或如何使用它们. 解决方案 它们不是向对象发送消息的另一种方法,它们是唯一的方法.例如,在[myView setValue:@"foo"]中,setValue:是选择器. (另一种不太方便的写相同方法的方法是objc_msgSend(myView, @selector(setValue:), @"foo"
..
在Objective-C中,我可以测试给定的类或实例是否响应某些选择器.但是如何查询类或实例的类的所有方法或属性(例如,所有方法或属性的列表)? 解决方案 您将要使用Objective C运行时方法,请参见此处:
..
我有UIScrollView的子类,我需要在内部对滚动行为做出响应.但是,viewcontroller仍将需要侦听滚动的委托回调,因此我无法彻底窃取组件中的委托. 是否有一种方法可以保留名为"delegate"的属性并仅侦听沿其发送的消息,或者以某种方式在内部内部劫持委托属性并在运行一些代码后向外转发消息? 解决方案 是的,但是您必须覆盖- (void)scrollViewDidSc
..
我需要一种传递属性并获取分配给它的名称的方法.有什么建议吗? @property (nonatomic, retain) MyObject *crazyObject; NSString *str = SOME_WAY_TO_GET_PROPERTY_NAME(crazyObject); // Above method should return @"crazyObject" 解决方案
..
据我所知,它是超类的指针.它与超类硬连接,并且无法在运行时动态找出.想更详细地了解它... 有人吗? 解决方案 从本质上讲,它允许您使用当前类的超类的实现. 对于坚韧 [super message]具有以下含义: 当遇到方法调用时, 编译器生成对以下其中一项的调用 函数objc_msgSend objc_msgSend_stret,objc_msgSendSuper, 或
..
我已经看到了许多在 Objective-C 中声明半私有方法的策略,但是似乎没有一种方法可以实现真正的私有方法.我接受.但是,为什么会这样呢?我基本上说过的每一种解释都是:“你做不到,但这是一个近似值." ivars(成员)有许多关键字可以控制其范围,例如@private,@public,@protected.为什么不能同时为方法完成此操作?似乎运行时应该能够支持.我是否缺少基本的哲学?这是
..