什么是'班级' Objective-C中的函数意味着什么?

时间:2015-07-01 14:55:54

标签: objective-c

@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理论的一部分吗?

3 个答案:

答案 0 :(得分:3)

嗯,这有点棘手,没用。它是关于Objective C实例内存

您的代码可以转换为此

    NSString * asdfasdfasdfsdf = @"xxxxxxx4";
    Class cls = [Soka class]; 
    void * obj = &cls; 
    id ocObj = (__bridge id)obj;
    NSLog(@"%@",[ocObj name]);

让我们逐一说清楚

  1. cls是一个Soka类对象

    Class cls = [Soka class];  
    
  2. obj是指向Soka Class对象的指针

    void * obj = &cls;
    
  3. 将obj转换为Object C对象

    id ocObj = (__bridge id)obj;
    
  4. 调用此[ocObj name]时,Objective C将在ocObj对象附近找到内存。堆栈中的@"xxxxxxx4"

  5. 另外,我测试这个以确保我是对的

    @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,您在该结构中隐藏了字段:_nameclass。它们按照相同的顺序排列,放置了您的变量asdfasdfasdfsdfcls

一切正常,因为地址&cls放置了Class类型的变量,它描述了类。因此,在将obj转换为id运行时查找必需字段之后,该字段描述了类并信任该指针指向Soka。当然它是错误的,但是根据情况,变量按相同的顺序和正确的位置排列,这些代码可以工作并且不会被粉碎。

您不能在堆栈中分配objective-c对象,如果您认为可以以这种方式分配objective-c对象,则应避免使用此代码。因为它可能导致不可预测的错误。

答案 2 :(得分:0)

class方法为您提供对象的类型。

例如,如果您想知道myObject是否为NSString,您可以这样做:

[myObject isKindOfClass:[NSString class]]

isKindOfClass将一个类型作为参数,因此我们在class上调用NSString来获取该类型。

就像C语言中的typeof一样。