Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/video/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 我应该分配调用我的类的结果';指定初始值设定项为self?_Objective C_Initialization_Core Plot - Fatal编程技术网

Objective c 我应该分配调用我的类的结果';指定初始值设定项为self?

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:(

我正在阅读core plot的源代码,并在
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:太好了,很高兴我能提供帮助。你是正确的。这个问题现在解决了。看见