我对 IBOutlets 的理解是它们充当了 Objective-C 类中的变量和属性的标记。Objective-C 运行时中是否有任何内容可以让人们在运行时查询 ivar 或属性或类是否已用 IBOutlet 标记?或者 XCode 只是在编译时对这些做了一些聪明的事情?
如果它们是运行时构造,是否可以定义自己的标记并以这种方式使用它们:
@private
MyMarker MyClass instance;
Run Code Online (Sandbox Code Playgroud) 我有几个与此相关的问题:在Objective-C中使用星号
NSArray数组; 在本地范围内,将是在堆栈上"分配"的对象.NSArray*数组; 表示由大量内存支持的对象,通常从堆中分配.
你怎么知道什么时候在堆栈和堆上分配了什么?堆栈上的所有局部变量都是堆上的指针吗?
因为您没有取消引用指向该对象的指针,并且指向该对象的指针在方法实现本身中是至关重要的.当你说...
呵呵
示例:我有一个视图控制器并摆脱它.但是仍然有一个变量保存它的内存地址.访问它会导致EXEC_BAD_ACCESS.当然.但是:有没有办法检查该变量是否仍然有效?即如果它仍然指向内存中存在的东西?
有这样的方法.
- (void)method: (CustomClass)param;
Run Code Online (Sandbox Code Playgroud)
CustomClass继承自NSObject.
我在m下面有一个变量,它是该Method方法的结构.我调用method_getArgumentType()以获取这样的参数类型:
char szArgType[100] = {0,};
Method m = ...;
...
method_getArgumentType(m, 2, szArgType, 100);
Run Code Online (Sandbox Code Playgroud)
我打印了szArgType.它打印@,但我想打印CustomClass.有没有一种很好的方法从Method运行时获取参数的真实对象类类型?
我正在通过这种方法替换@synthesized(自我)锁
void _ThreadsafeInit(Class theClassToInit, void *volatile *theVariableItLivesIn, void(^InitBlock)(void))
{
//this is what super does :X
struct objc_super mySuper = {
.receiver = (id)theClassToInit,
.super_class = class_getSuperclass(theClassToInit)
};
id (*objc_superAllocTyped)(struct objc_super *, SEL, NSZone *) = (void *)&objc_msgSendSuper;
// id (*objc_superAllocTyped)(id objc_super, SEL, NSZone *) = (void *)&objc_msgSend;
do {
id temp = [(*objc_superAllocTyped)(&mySuper /*theClassToInit*/, @selector(allocWithZone:), NULL) init];//get superclass in case alloc is blocked in this class;
if(OSAtomicCompareAndSwapPtrBarrier(0x0, temp, theVariableItLivesIn)) { //atomic operation forces synchronization
if( InitBlock != NULL ) { …Run Code Online (Sandbox Code Playgroud) 随着ARC的出现,一些新功能可供开发人员使用弱引用对象.id objc_loadWeak(id *location)是其中之一.此函数接收一个参数,该参数对应于存储弱对象的内存中的某个位置,如果该对象仍处于活动状态或nil已取消分配,则返回该对象.
似乎当一个对象obj被存储weak在一个位置location时id objc_storeWeak(id *location, id obj),obj被放在一个"弱地图"中,location作为一个键.但是,为了检索obj,objc_loadWeak不仅可以location用作键并返回值,这对应于obj.它还必须检查是否obj仍然存活,nil如果不再存在则返回.
但是,objc_loadWeak无法尝试读取对象的保留计数,因为该对象可能已被释放.此外,尽管弱地图,objc_storeWeak,objc_loadWeak和NSObject类以相同的文件(实施NSObject.mm)NSObject的dealloc方法没有信号给正被释放的对象消失弱地图.
那么,Objective-C运行时如何判断一个weak对象是否还活着?
weak-references objective-c objective-c-runtime automatic-ref-counting
我需要能够区分目标c内置类和特定于应用程序的类.我现在正在做出这个决定的方法是检查班级名称是否以"__"开头,这是一个可怕的hacky解决方案,但它确实有效.
所以我的问题是,确定一个类是基于类的构建还是特定于应用程序的类的正确方法是什么?
//a variable named object is defined already
unsigned int outCount, i;
objc_property_t *properties = class_copyPropertyList([object class], &outCount);
for (i = 0; i < outCount; i++)
{
objc_property_t property = properties[i];
NSString *propertyName = [NSString stringWithUTF8String:property_getName(property)];
id propertyValue = [object valueForKey:(NSString *)propertyName];
NSString *classString = NSStringFromClass([propertyValue class]);
if ((classString.length > 2 && [[classString substringToIndex:2] isEqual:@"__"]))
{
// Objective C Class (NSString, NSArray, NSDate, NSNumber)
}
else
{
// Not Objetive C Class
}
}
Run Code Online (Sandbox Code Playgroud) 在Apple的ObjC运行时指南中,它描述了该objc_msgSend()函数对动态调度的作用:
- 它首先找到选择器引用的过程(方法实现).由于可以通过单独的类以不同方式实现相同的方法,因此它找到的精确过程取决于接收器的类.
- 然后它调用该过程,将接收对象(指向其数据的指针)以及为该方法指定的任何参数传递给它.
- 最后,它将过程的返回值作为自己的返回值传递.
我在第二步感到困惑,它提到"接收对象(指向其数据的指针)
那是什么?
有人可以给我一个说明来澄清它吗?
我有下一个代码,我得到一个指向实例方法的指针:
#import <Foundation/Foundation.h>
#import <objc/runtime.h>
@interface TestClass : NSObject
@end
@implementation TestClass
- (void)someMethod { // This is instance method, it's okay
NSLog(@"Hello from some method!");
}
@end
int main(int argc, const char * argv[]) {
typedef void (*MethodWithoutParams)();
MethodWithoutParams someMethodImplementation =
class_getMethodImplementation([TestClass class], @selector(someMethod));
someMethodImplementation();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
它的效果非常好.但是,如果我想获得一个指向类方法的指针,它不起作用:
#import <Foundation/Foundation.h>
#import <objc/runtime.h>
@interface TestClass : NSObject
@end
@implementation TestClass
+ (void)someMethod { // This is class method, it doesn't work
NSLog(@"Hello from some method!");
}
@end
int main(int …Run Code Online (Sandbox Code Playgroud) 我正在研究一个内部工具(永远不会提交给App Store的东西),我想在运行时检测一个类是Objective-C还是Swift.这可能吗?