Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/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
Ios 内在弱参考与非内在弱参考?_Ios_Objective C_Cocos2d Iphone - Fatal编程技术网

Ios 内在弱参考与非内在弱参考?

Ios 内在弱参考与非内在弱参考?,ios,objective-c,cocos2d-iphone,Ios,Objective C,Cocos2d Iphone,那些日子里,我在ubuntu上用一个移植的cocos2d(名为cocostep)玩得很开心。当我深入研究“CCdirector.m”的cocos2d源代码并观察到“它是弱引用”所评论的几点时,我发现了一些有趣的事情。以我对objective-c、ios和osx的了解。一个ref是弱的,必须在前面加上_弱关键字,但实际上,我并没有在整个项目中提供任何引用。所以我猜这是一些非内在的弱引用,只是cocos2d设计器的策略。根据我的假设。如果某个变量作为弱引用(非内在)被调用,并将其内存释放到其他地方,

那些日子里,我在ubuntu上用一个移植的cocos2d(名为cocostep)玩得很开心。当我深入研究“CCdirector.m”的cocos2d源代码并观察到“它是弱引用”所评论的几点时,我发现了一些有趣的事情。以我对objective-c、ios和osx的了解。一个ref是弱的,必须在前面加上_弱关键字,但实际上,我并没有在整个项目中提供任何引用。所以我猜这是一些非内在的弱引用,只是cocos2d设计器的策略。根据我的假设。如果某个变量作为弱引用(非内在)被调用,并将其内存释放到其他地方,那么对该引用的后续调用将失败,甚至崩溃,因为该引用的值不是nil,而是对该内存的无效引用。为了正确使用这些策略,我必须手动将该变量重置为nil。我的猜测正确吗?

Cocos2d不使用ARC。注释中标记为弱的任何引用均为非保留引用。这意味着,如果引用被解除分配且未手动设置为nil,则引用可能指向无效内存。

您的推测是正确的

Cocos2d不使用ARC,所以当他们说
weak
时,它不是正确意义上的
weak

这些变量的正确术语应该是
不安全_unretained
,这意味着不保留和不自动无效


这些变量可能是悬空的指针,因此您最好注意这一点,并尽快手动将其置零。

hi@LearnCos2D,是的cocos2d不使用arc。因此我认为这是一些设计策略,应该像arc Automatically一样手动将其设置为nil,如果在解除分配后发送消息给它。你可以查看Mike Ash@nielsbot的MAZeroingWeakRef谢谢你的重播。你能告诉我ARC和ARC.m(来自libobjc2)之间的本质区别吗。这是ARC_u弱说明符在本机弱引用api之上工作吗?嗨,@Gabriele Petronella。谢谢我在谷歌上搜索了一个链接::引用本机弱引用api的文章是为ARC构建弱机制的。正确的?
@interface ....
/* will be the next 'runningScene' in the next frame
     nextScene is a weak reference. */
    CCScene *nextScene_;
@end
@implementation .......
-(void) replaceScene: (CCScene*) scene
{
    NSAssert( scene != nil, @"Argument must be non-nil");

    NSUInteger index = [scenesStack_ count];

    sendCleanupToScene_ = YES;
    [scenesStack_ replaceObjectAtIndex:index-1 withObject:scene];
    nextScene_ = scene; // nextScene_ is a weak ref
}

- (void) pushScene: (CCScene*) scene
{
    NSAssert( scene != nil, @"Argument must be non-nil");

    sendCleanupToScene_ = NO;

    [scenesStack_ addObject: scene];
    nextScene_ = scene; // nextScene_ is a weak ref
}
@end