Objective c 我应该分配调用我的类的结果';指定初始值设定项为self?
我正在阅读core plot的源代码,并在Objective c 我应该分配调用我的类的结果';指定初始值设定项为self?,objective-c,initialization,core-plot,Objective C,Initialization,Core Plot,我正在阅读core plot的源代码,并在CPTColor中浏览了这段代码: -(id)initWithCGColor:(CGColorRef)newCGColor { if ( (self = [super init]) ) { CGColorRetain(newCGColor); cgColor = newCGColor; } return self; } -(id)initWithComponentRed:(
CPTColor
中浏览了这段代码:
-(id)initWithCGColor:(CGColorRef)newCGColor
{
if ( (self = [super init]) ) {
CGColorRetain(newCGColor);
cgColor = newCGColor;
}
return self;
}
-(id)initWithComponentRed:(CGFloat)red green:(CGFloat)green blue:(CGFloat)blue alpha:(CGFloat)alpha
{
CGFloat colorComponents[4];
colorComponents[0] = red;
colorComponents[1] = green;
colorComponents[2] = blue;
colorComponents[3] = alpha;
CGColorRef color = CGColorCreate([CPTColorSpace genericRGBSpace].cgColorSpace, colorComponents);
[self initWithCGColor:color];
CGColorRelease(color);
return self;
}
如果[self initWithCGColor:color]
会导致initWithCGColor
的超类为self分配不同的值,该新值是否会从initWithComponentRed:green:blue:alpha:
返回
换句话说,两个init方法中的
self
是同一个变量还是两个不同的变量?如果self
要更改(例如,如果要实现颜色缓存)initWithComponentRed:green:blue:alpha:
将返回错误的对象,除非代码更改为:
...
self = [self initWithCGColor:color];
CGColorRelease(color);
return self;
}
如果
self
要更改(例如,如果要实现颜色缓存)initWithComponentRed:green:blue:alpha:
将返回错误的对象,除非代码更改为:
...
self = [self initWithCGColor:color];
CGColorRelease(color);
return self;
}
self
总是指同一个对象。它不是一个“变量”,而是一个语言关键词。如果一个初始值设定项在另一个初始值设定项之后被调用,那么对象将被简单地更改
注:否则,你的课程会有“人格分裂”;-)
self
总是指同一个对象。它不是一个“变量”,而是一个语言关键词。如果一个初始值设定项在另一个初始值设定项之后被调用,那么对象将被简单地更改
注:否则,你的课程会有“人格分裂”;-) 此设置可能很脆弱,Joe的建议是,在返回该值之前,在
initWithComponentRed:…
中指定self
,这将解决此问题
每个方法都会获得一个参数,self
,该参数指向调用它的实例。参数的作用与任何其他变量一样;这没什么特别的。这就是为什么可以分配self
,以及为什么需要在初始值设定项中有一个显式的return
发送[super init]
时,使用的是超类版本的init
方法,但当前实例仍将作为self
传递。由于Objective-C中的初始值设定项可以销毁它们接收的对象并创建并返回一个新对象,*因此,initWithColor:
中的self=[super init]
可能与initWithComponentRed:
中的self
指向的对象不同
如果发生这种情况,因为您没有重新指定self
指向新的、正确初始化的对象,所以您将从initWithComponentRed:…
返回一个未初始化的对象
如果您的超类可以执行我描述的替换,那么这只是一个实际问题,但是,恕我直言,也没有理由不执行这种重新分配
*例如,集合之所以这样做,是因为它们不知道在
alloc
时它们需要有多大;我相信NSNumber
也能做到这一点,因为它为代表小整数的实例缓存了值。这个设置可能很脆弱,Joe的建议是,在initWithComponentRed:…
中指定self
,然后返回该值将修复它
每个方法都会获得一个参数,self
,该参数指向调用它的实例。参数的作用与任何其他变量一样;这没什么特别的。这就是为什么可以分配self
,以及为什么需要在初始值设定项中有一个显式的return
发送[super init]
时,使用的是超类版本的init
方法,但当前实例仍将作为self
传递。由于Objective-C中的初始值设定项可以销毁它们接收的对象并创建并返回一个新对象,*因此,initWithColor:
中的self=[super init]
可能与initWithComponentRed:
中的self
指向的对象不同
如果发生这种情况,因为您没有重新指定self
指向新的、正确初始化的对象,所以您将从initWithComponentRed:…
返回一个未初始化的对象
如果您的超类可以执行我描述的替换,那么这只是一个实际问题,但是,恕我直言,也没有理由不执行这种重新分配
*例如,集合之所以这样做,是因为它们不知道在
alloc
时它们需要有多大;我相信NSNumber
也能做到这一点,因为它为代表小整数的实例缓存了值。这并不正确“自我”是一个变量;这是每个方法的一个隐含参数。当前实例作为值传入,但可以重新分配本地“self”指针。这不会影响其他方法的效果,这是不正确的“自我”是一个变量;这是每个方法的一个隐含参数。当前实例作为值传入,但可以重新分配本地“self”指针。这不会影响其他方法的效果。这是我的想法,但我想确认一下。为了进一步确保,我编写了一个简单的测试程序,其中超类释放self
,如果alpha通道为0,则返回nil。在这种情况下,子类的初始值设定项返回一个无效的引用,而不是正确的nil
@SSteve:太好了,很高兴我能提供帮助。你是正确的。这个问题现在解决了。看,我是这么想的,但我想确认一下。为了进一步确保,我编写了一个简单的测试程序,其中超类释放self
,如果alpha通道为0,则返回nil。在这种情况下,子类的初始值设定项返回一个无效的引用,而不是正确的nil
@SSteve:太好了,很高兴我能提供帮助。你是正确的。这个问题现在解决了。看见