gpt4 book ai didi

objective-c - Objective-C block 中的静态变量?

转载 作者:太空狗 更新时间:2023-10-30 03:54:54 25 4
gpt4 key购买 nike

我正在研究一些 CoreAnimation 的东西。带有几个 View Controller 的导航 Controller 。并且 View Controller 具有用于“小册子”的不同“页面”的 UISCrollViews。在每个页面上,当用户翻到该页面时,可能会触发一些动画。

我正在尝试这样的事情(对于一次性动画)。

void (^animationBlock)() =
^{
static bool alreadyTriggered = NO;
if(alreadyTriggered)
return;

[CATransaction begin];
[CATransaction setCompletionBlock:
^{
alreadyTriggered = YES;
}];

// Do me some animations...

[CATransaction commit];
};

NSMutableDictionary* pageBlocks = [[NSMutableDictionary alloc] init];
[pageBlocks setObject:[animationBlock copy] forKey:<animation's name>];
[self.animationBlocks setObject:pageBlocks forKey:<some page number>];

[pageBlocks release];
[animationBlock release];

“动画名称”和“某些页码”是为了解释起见的占位符(它们是任意的 NSString 文字)。

触发这些动画的代码是:

- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView
{
int pageNumber = floor(self.scrollView.contentOffset.x / self.scrollView.frame.size.width);
NSMutableDictionary* pageBLocks = [self.animationBlocks objectForKey:[NSString stringWithFormat:@"page%i",pageNumber]];
[CATransaction begin];
for(id key in pageBLocks)
((void (^)())[pageBLocks objectForKey:key])();
[CATransaction commit];
}

到目前为止一切顺利,只是如果我从导航 Controller 中弹出小册子(也就是在小册子上调用 dealloc)然后再次将其插入,静态 bool 值仍然设置。

我的想法:

- 我是否保留了区 block ? 我不知道.. 我在将它(带副本)添加到字典后调用 release 并且小册子的 dealloc 方法调用字典上的 release。

- 我是否在某处保存了另一个静态 bool 值副本?当我在方法范围内将 block 声明为静态时,我的第一个 bool 被分配。这完全取决于我没有研究过的 Objective-C 的激活记录方案。但假设是这样,当在 popViewcOntroller 上释放对象时,该副本就消失了。将它添加到字典时调用 block 上的副本的另一个副本应该在字典被杀死时释放吗?

我是否保留了整个小册子对象本身?我没有完全从 Apple 文档中得到它,但他们说如果我通过引用访问实例变量,我会保留 self。我尝试从 block 内释放 self ,一切都保持正常运行......?

最佳答案

让 block 返回一个值,然后决定是否从字典中删除 block 。

// ...
BOOL shouldRemove = block();

if (shouldRemove) {
[pageBlocks removeObjectForKey:key];
}
// ...

让我们测试静态变量

@interface TestClass : NSObject
@end

@implementation TestClass

- (void(^)(void))block;
{
return [[^{

static BOOL staticBOOL = NO;

NSLog(@"%d", staticBOOL);

staticBOOL = YES;

} copy] autorelease];
}

@end

int main(int argc, char *argv[]) {
NSAutoreleasePool *p = [[NSAutoreleasePool alloc] init];

TestClass *test1 = [[TestClass alloc] init];
test1.block();
test1.block();

TestClass *test2 = [[TestClass alloc] init];
test2.block();
test2.block();

[p release];
}

这输出

#=> 2012-04-23 00:43:38.501 Untitled[8380:707] 0
#=> 2012-04-23 00:43:38.503 Untitled[8380:707] 1
#=> 2012-04-23 00:43:38.503 Untitled[8380:707] 1
#=> 2012-04-23 00:43:38.504 Untitled[8380:707] 1

我们如何解决这个问题?一旦它像这样执行,我可能会从字典中删除该对象

- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView;
{
NSInteger pageNumber = floor(self.scrollView.contentOffset.x / self.scrollView.frame.size.width);
NSMutableDictionary *pageBlocks = [self.animationBlocks objectForKey:[NSString stringWithFormat:@"page%i", pageNumber]];

[CATransaction begin];

for (id key in [pageBlocks copy]) {
void (^block)(void) = [pageBlocks objectForKey:key];
if (block) {
block();
}
[pageBlocks removeObjectForKey:key];
}

[CATransaction commit];
}

关于objective-c - Objective-C block 中的静态变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10273006/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com