Objective-C:自变量理解问题

时间:2013-03-14 10:07:06

标签: objective-c self

我想了解一些关于self的功能。

  1. 哪种上下文在类方法中有self变量?
  2. 为什么self.self方法允许init
  3. 首先:

    我们有一个班级ExampleClass

    @interface ExampleClass:NSObject
    @property (nonatomic,strong) NSString* a;
    
    +(ExampleClass*)createExampleClass;
    
    @end
    
    @implementation ExampleClass
    
    -(id)init{
        self = [super init];
        if(self){
            [self.self init]; #Allowed
            [self init]; #Not Allowed ?
        }
    
    }
    
    +(ExampleClass*)createExampleClass{
        /*do work here*/
        NSLog(@"Self: %@ \n Class: %@",self,[self class]);
    }
    @end
    

    在这个例子中,我们将看到如下内容:

    Self: ExampleClass
    Class: ExampleClass
    

    但为什么?!

    允许使用init方法[self.self init],但不允许'[self init]'。

    为什么会这样?

4 个答案:

答案 0 :(得分:4)

在类方法中,self是类。对于课程[self class],只需返回self,因此self[self class]基本上是相同的。

[self init]方法中调用init没有任何意义,它会导致无限递归。但是,你得到的编译器错误是ARC的限制,如果你使用self = [self init],错误就会消失,但它仍然没有意义。您可以使用不同的初始化方法执行此操作,以调用指定的初始化程序。

答案 1 :(得分:0)

    类方法中的
  1. self是类对象本身。

  2. NSObjectself方法返回。

    见这里:https://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Protocols/NSObject_Protocol/Reference/NSObject.html#//apple_ref/occ/intfm/NSObject/self

    Self:ExampleClass //类的名称。 Class:ExampleClass //与类对象相同的元类对象的名称。

  3. 如果打印指针地址,您将看到两个对象不同。

    这是很好的插图和描述。 http://www.sealiesoftware.com/blog/archive/2009/04/14/objc_explain_Classes_and_metaclasses.html

答案 2 :(得分:0)

self.self[self self]的缩写,除了self之外什么都不做。

答案 3 :(得分:-1)

self.self.self.self.self.self也有效:)或[[self self] .self self] .self.self