@interface Soka : NSObject
@property (nonatomic, copy) NSString * name;
-(void)speak;
@end
@implementation Soka
-(void)speak{
NSLog(@"my name is: %@", self.name);
}
@end
int main(int argc, const char * argv[]) {
@autoreleasepool {
NSString * asdfasdfasdfsdf = @"xxxxxxx4";
id cls = [Soka class];
void * obj = &cls;
[(__bridge id)obj speak];
}
return 0;
}
输出结果为:
[14402:5468392] my name is: xxxxxxx4
任何人都可以解释这个吗?
如何将asdfasdfasdfsdf值设置为类属性?
由于
进行更新: @Leo
感谢您的回复。
1# Soka Class object cls 的含义是什么,它的内存结构是什么。它的指针指向什么地址?
2#在ocObj对象附近找到内存?如果最近的内存是整数值怎么办?它是OBJC或whatelse理论的一部分吗?
答案 0 :(得分:3)
嗯,这有点棘手,没用。它是关于Objective C实例内存
您的代码可以转换为此
NSString * asdfasdfasdfsdf = @"xxxxxxx4";
Class cls = [Soka class];
void * obj = &cls;
id ocObj = (__bridge id)obj;
NSLog(@"%@",[ocObj name]);
让我们逐一说清楚
cls是一个Soka类对象
Class cls = [Soka class];
obj是指向Soka Class对象的指针
void * obj = &cls;
将obj转换为Object C对象
id ocObj = (__bridge id)obj;
调用此[ocObj name]
时,Objective C将在ocObj对象附近找到内存。堆栈中的@"xxxxxxx4"
。
另外,我测试这个以确保我是对的
@interface Soka : NSObject
@property (nonatomic, copy) NSString * name;
@property (nonatomic,copy) NSString * address;
-(void)speak;
@end
@implementation Soka
-(void)speak{
NSLog(@"my name is: %@", self.name);
}
@end
int main(int argc, char * argv[]) {
@autoreleasepool {
NSString * asdfasdfasdfsdf = @"xxxxxxx4";
NSString * address = @"address";
Class cls = [Soka class];
void * obj = &cls;
id ocObj = (__bridge id)obj;
NSLog(@"%@",[ocObj name]);
NSLog(@"%@",[ocObj address]);
return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
}
}
这将记录
2015-07-01 23:26:56.857 OCTest[10910:347815] address
2015-07-01 23:26:56.859 OCTest[10910:347815] xxxxxxx4
<强>更新强>
+class
函数将返回一个类的类对象,类型为Class
。
那么,什么是Class
类型,它是关于Objective c runtime
typedef struct objc_class *Class;
这是objc_class的定义
struct objc_class {
Class isa OBJC_ISA_AVAILABILITY;
#if !__OBJC2__
Class super_class OBJC2_UNAVAILABLE;
const char *name OBJC2_UNAVAILABLE;
long version OBJC2_UNAVAILABLE;
long info OBJC2_UNAVAILABLE;
long instance_size OBJC2_UNAVAILABLE;
struct objc_ivar_list *ivars OBJC2_UNAVAILABLE;
struct objc_method_list **methodLists OBJC2_UNAVAILABLE;
struct objc_cache *cache OBJC2_UNAVAILABLE;
struct objc_protocol_list *protocols OBJC2_UNAVAILABLE;
#endif
} OBJC2_UNAVAILABLE;
创建Objective C对象时,它将自动管理内存。在你的代码中,制作像内存这样的Objective C对象只是一个技巧。
答案 1 :(得分:1)
实际上,objective-c的类是具有属性的结构。
对于您的班级Soka
,您在该结构中隐藏了字段:_name
和class
。它们按照相同的顺序排列,放置了您的变量asdfasdfasdfsdf
和cls
。
一切正常,因为地址&cls
放置了Class
类型的变量,它描述了类。因此,在将obj
转换为id
运行时查找必需字段之后,该字段描述了类并信任该指针指向Soka
。当然它是错误的,但是根据情况,变量按相同的顺序和正确的位置排列,这些代码可以工作并且不会被粉碎。
您不能在堆栈中分配objective-c对象,如果您认为可以以这种方式分配objective-c对象,则应避免使用此代码。因为它可能导致不可预测的错误。
答案 2 :(得分:0)
class
方法为您提供对象的类型。
例如,如果您想知道myObject
是否为NSString
,您可以这样做:
[myObject isKindOfClass:[NSString class]]
isKindOfClass
将一个类型作为参数,因此我们在class
上调用NSString
来获取该类型。
就像C语言中的typeof
一样。