什么是以下Objective-C代码的等效swift代码.我无法找到运行时概念的快速主题.
#import <objc/runtime.h>
Class class = [self class];
Run Code Online (Sandbox Code Playgroud)
试图获得类对象self?
更新:
尝试使用以下代码,得到错误'UIViewController.type' doesn't conform to protocol 'AnyObject'
var klass: AnyClass = object_getClass(self)
Run Code Online (Sandbox Code Playgroud)
注意:找到这篇文章,但没有帮助.
我有一个UIScrollView的子类,我需要在内部响应滚动行为.但是,viewcontroller仍然需要监听滚动的委托回调,所以我不能直接窃取我的组件中的委托.
有没有办法保持名为"委托"的属性,只是听从它发送的消息,或者以某种方式内部劫持委托属性并在运行一些代码后向外转发消息?
我想将字符串转换为类名.想象一下,我有一个更改的字符串,包含一个类名,例如字符串"MyExampleClass".现在,我想创建一个类的对象MyExampleClass.我必须从字符串中获取类名.我想做类似以下的事情.(将代码视为草图.)
NSString *classNameStr = "MyExampleClass";
id theClass = [UIClass classFromString:classNameStr];
theClass *myObject = [[theClass alloc] init];
Run Code Online (Sandbox Code Playgroud)
这样做的正确方法是什么?
我正在尝试使用obj-c运行时方法从我的类中获取属性,我在这里的答案中找到了,但是我在编码时遇到了很多警告/错误,我是否需要导入库或制作一些东西为了让obj-c运行时函数可用?
objc_property_t*properties = class_copyPropertyList([self class],&outCount);
警告:"隐式声明函数'class_copyPropertyList'在C99中无效错误:使用未声明的标识符'objc_property_t'
这是我复制的整个块:
unsigned int outCount, i;
objc_property_t *properties = class_copyPropertyList([self class], &outCount);
for (i = 0; i < outCount; i++) {
objc_property_t property = properties[i];
NSString *propertyName = [[NSString alloc] initWithCString:property_getName(property)];
id propertyValue = [self valueForKey:(NSString *)propertyName];
if (propertyValue) [props setObject:propertyValue forKey:propertyName];
}
free(properties);
Run Code Online (Sandbox Code Playgroud)
提前致谢!.
我需要一种方法来传递属性并获取分配给它的名称.有什么建议?
@property (nonatomic, retain) MyObject *crazyObject;
NSString *str = SOME_WAY_TO_GET_PROPERTY_NAME(crazyObject);
// Above method should return @"crazyObject"
Run Code Online (Sandbox Code Playgroud) introspection objective-c objective-c-runtime declared-property
如果我有一个类,我怎么能列出它的所有实例变量名?
例如:
@interface MyClass : NSObject {
int myInt;
NSString* myString;
NSMutableArray* myArray;
}
Run Code Online (Sandbox Code Playgroud)
我想得到"myInt","myString"和"myArray".有没有办法可以得到一个我可以迭代的名字数组?
我已经尝试过搜索Objective-C文档但找不到任何东西(我也不确定这是什么).
现代(64位OS X和iPhone OS)Objective C运行时的一个特性是属性能够动态合成ivars而无需在类中明确声明它们:
@interface MyClass : NSObject {
// NSString *name; unnecessary on modern runtimes
}
@property (retain) NSStrng *name;
@end
@implementation MyClass
@synthesize name;
@end
Run Code Online (Sandbox Code Playgroud)
在我的相当多的代码中,我使用自定义getter实现来初始化属性:
- (NSString *) name {
if (!name) {
name = @"Louis";
}
return name;
}
Run Code Online (Sandbox Code Playgroud)
以上与合成的ivars不兼容,因为它需要访问未在标题中声明的ivar.由于各种原因,我想更新一些我的个人框架,以便在现代运行时构建时使用合成的ivars,需要修改上述代码以使用合成的ivars来实现该目标.
虽然Objective C 2.0文档指出现代运行时的合成访问器将在首次使用时合成ivar.它没有指定使用什么低级机制来执行此操作.它是由class_getInstanceVariable()完成的,对class_addIvar()的限制是否松散,是否是一个未记录的函数在客观的C 2.0运行时?虽然我可以为支持我的属性的数据实现自己的副存储,但我更愿意使用合成访问器正在使用的机制.
当使用关联对象,从iOS 4和OSX 10.6开始提供Objective-C运行时功能时,必须定义用于在运行时存储和检索对象的密钥.
典型的用法是定义如下的密钥
static char const * const ObjectTagKey = "ObjectTag";
Run Code Online (Sandbox Code Playgroud)
然后使用是存储对象
objc_setAssociatedObject(self, ObjectTagKey, newObjectTag, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
Run Code Online (Sandbox Code Playgroud)
并检索它
objc_getAssociatedObject(self, ObjectTagKey);
Run Code Online (Sandbox Code Playgroud)
(例如http://oleb.net/blog/2011/05/faking-ivars-in-objc-categories-with-associative-references/)
是否有更简洁的方法来定义关联的对象键,这不涉及额外变量的声明?
我知道OBJC_ASSOCIATION_ASSIGN存在,但是如果目标对象被释放,它是否会将引用归零?或者它是否像旧时代那样需要获取nil-ed或者我们以后会冒错误访问?
Apple的Objective C Runtime Guide指出,不要在自己的代码中使用objc_msgSend(),而是建议使用methodForSelector:.但是,它没有提供任何理由.
在代码中调用objc_msgSend()有什么危险?