我testing了一些与Swift混合的isa ,发现它只有在NSObject是一个超级类(直接或更高级)或者使用'@objc'装饰时才起作用。 否则,它将遵循静态和虚表分发风格,如C ++。 定义一个没有Cocoa / NSObject基类的Swift类是正常的吗? 如果是我所关心的,这意味着Objective-C的许多dynamic性,比如方法拦截和运行时自省。 dynamic运行时行为是属性观察者,核心数据, 面向方面编程 , 高级消息传递 ,分析和日志框架等function的核心。 使用Objective-C的方法调用样式可以将大约20个机器代码操作数添加到方法调用中,因此在某些情况下( 对具有小实体的方法进行多次严格的调用 ),C ++风格的静态调度和vtable调度可以更好地执行。 但是,考虑到一般的95-5规则( 性能增益的95%来自调整代码的5% ),从强大的dynamic特性开始并在必要时加强是不合理的?
我想从类对象本身获得一个类的string名称。 // For instance [NSArray className]; // @"NSArray" 我发现object_getClassName(id obj)但需要一个实例传递给它,在我的情况下,这是不必要的工作。 那么如何从类对象中获取string,而不是实例呢?
在Objective-C中 ,我已经看到了许多用于声明半私有方法的策略,但似乎没有办法做出一个真正私有的方法。 我接受。 但是,为什么这样呢? 我基本上每一个解释都说:“你做不到,但是这是一个近似的近似。” 有一些关键字适用于控制其范围的ivars (成员),例如@public , @protected @public , @protected 。 为什么做不到这一点呢? 这似乎是运行时应该能够支持的东西。 有没有我错过的基本哲学? 这是故意的吗?
我在这里读了学习C Objective-C之前? 通常我会用纯C代码代替一些Obj-C代码(毕竟你可以尽可能多地混合它们,Obj-C方法的内容可以完全是纯C代码) 这是真的? 是否有可能纯粹用C语言编写iPhone应用程序?
在我接受的一个项目中,原作者select使用objc_setAssociatedObject() ,我不能100%清楚它做了什么或者他们为什么决定使用它。 我决定查阅,不幸的是,这些文件对其目的不是很明确。 objc_setAssociatedObject 使用给定的键和关联策略设置给定对象的关联值。 void objc_setAssociatedObject(id object, void *key, id value, objc_AssociationPolicy policy) 参数 object 关联的源对象。 key 协会的关键。 value 与对象的键关联的值。 通过零来清除现有的关联。 policy 协会的政策。 有关可能的值,请参阅“关联对象行为”。 那么这个函数究竟做了什么,在什么情况下应该使用它呢? 阅读答案后编辑 那么下面的代码有什么意义呢? Device *device = [self.list objectAtIndex:[indexPath row]]; DeviceViewController *next = [[DeviceViewController alloc] initWithController:self.controller device:device item:self.rootVC.selectedItem]; objc_setAssociatedObject(device, &kDeviceControllerKey, next, OBJC_ASSOCIATION_RETAIN); 如果它已经是一个实例variables,那么将设备与视图控制器关联起来有什么意义呢?
我需要一种方式来传递一个属性,并获得分配给它的名称。 有什么build议么? @property (nonatomic, retain) MyObject *crazyObject; NSString *str = SOME_WAY_TO_GET_PROPERTY_NAME(crazyObject); // Above method should return @"crazyObject"
是否有可能在运行时向Objective C对象添加属性?