我想了解一些关于self
的功能。
self
变量?self.self
方法允许init
?首先:
我们有一个班级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]'。
为什么会这样?
答案 0 :(得分:4)
在类方法中,self
是类。对于课程[self class]
,只需返回self
,因此self
和[self class]
基本上是相同的。
在[self init]
方法中调用init
没有任何意义,它会导致无限递归。但是,你得到的编译器错误是ARC的限制,如果你使用self = [self init]
,错误就会消失,但它仍然没有意义。您可以使用不同的初始化方法执行此操作,以调用指定的初始化程序。
答案 1 :(得分:0)
self
是类对象本身。
NSObject
有self
方法返回。
Self:ExampleClass //类的名称。 Class:ExampleClass //与类对象相同的元类对象的名称。
如果打印指针地址,您将看到两个对象不同。
这是很好的插图和描述。 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