Tag: objective c blocks

奇怪的问题,由于块的支持iOS 3.1.3

因为我经常在3.1.3设备上testing我的应用程序,所以我不得不添加一个链接器标志“-weak_library /usr/lib/libSystem.B.dylib”来支持那里的块。 直到我刚刚开始添加一些来自苹果示例的gamecenter编码,这是没有问题的。 只有在模拟器中,当一个块(甚至是空的块)作为GC编码中的authenticationcallback被移交时,我在Apple的libs中深处发生了即时崩溃(EXC_BAD_ACCESS)。 当我提供零作为callback,GClogin工作正常,应用程序继续。 它在所有真实设备(iPad,iOS 4.3的iPhone,iOS 3.1.3的iPod – 当然不带GC)上都能正常工作。 当我删除链接器的弱链接标志时,它也将在模拟器中运行无问题。 有没有人知道那里发生了什么? 这不是一个令人满意的解决scheme,只在每次我想部署到我的古老iPod时添加链接器标志。 谢谢,habitoti

为什么UIViewController在主线程上解除分配?

我最近偶然发现了一些Objective-C代码中的Deallocation Problem 。 这个主题之前讨论过,在Block_release的 Stack Overflow 释放后台线程上的UI对象 。 我想我明白这个问题及其含义,但是确定我想在一个小testing项目中重现它。 我首先创build了我自己的SOUnsafeObject (=总是应该在主线程上解除分配的对象)。 @interface SOUnsafeObject : NSObject @property (strong) NSString *title; – (void)reloadDataInBackground; @end @implementation SOUnsafeObject – (void)reloadDataInBackground { dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ dispatch_async(dispatch_get_main_queue(), ^{ self.title = @"Retrieved data"; }); sleep(3); }); } – (void)dealloc { NSAssert([NSThread isMainThread], @"Object should always be deallocated on the main thread"); } […]

在实例variables中保存一个块

我们如何声明一个全局(私有实例variables)来接受一个块。 我们是否需要综合它,以及它的内存pipe理含义是什么? 我有一个从第三方收到的块,我想保存在实例variables中,并在稍后阶段使用它。

返回dispatch_async提取的variables

基本上:一个方法需要返回一个在dispatch_async中获取的NSDictionary。 这是我曾经试过的: – (NSDictionary *)fetchNSDictionary { dispatch_queue_t Queue = dispatch_queue_create("Dictionary fetcher", NULL); dispatch_async(Queue, ^{ NSDictionary *dict = … dispatch_async(dispatch_get_main_queue(),^{ return dict; )}; )}; } 结果: Incompatible block pointer types passing 'NSDictionary *(^)(void)' to parameter of type 'dispatch_block_t' (aka 'void (^)(void)') 有任何想法吗?

如何在swift中使用block / closure

在我的应用程序之一,我已经使用块进行web服务调用并获得响应。 现在我想用swift编写这个应用程序,但是我在Swift中使用blocks / Closure时遇到了麻烦。 这是我想快速迁移的目标C代码: – //调用Communicator的类方法 [[Communicator sharedInstance]callWebService:WS_LOGIN withMethod:POST_METHOD andParams:params showLoader:YES completionBlockSuccess:^(id obj) { //Do play with data }completionBlockFailiure:^(id obj) { //Show alert with error }]; //在传播者类 -(void)callWebService:(NSString *)serviceName withMethod:(NSString *)methodName andParams:(NSDictionary *)params showLoader:(BOOL)showLoader completionBlockSuccess:(void (^)(id))aBlock completionBlockFailiure:(void (^)(id))aFailBlock { if (showLoader) { // show loader } [self performRequestWithServiceName:serviceName method:methodName andParams:params successblock:aBlock failureblock:aFailBlock]; } – […]

引用块内的实例variables

假设我有一个类(非ARC环境): @interface SomeObject : NSObject { UILabel *someLabel; dispatch_queue_t queue; } – (void)doAsyncStuff; – (void)doAnimation; @end @implementation SomeObject – (id)init { self = [super init]; if (self) { someLabel = [[UILabel alloc] init]; someLabel.text = @"Just inited"; queue = dispatch_queue_create("com.me.myqueue", DISPATCH_QUEUE_SERIAL); } return self; } – (void)doAsyncStuff { dispatch_async(queue, ^{ … // Do some stuff […]

目标C块作为asynchronouscallback和不良访问

我有一个严重的怀疑。 假设以下情况: 你有一个UIViewController在屏幕上。 应用程序启动,例如,使用块作为callback的后端调用 你使用“自我”代理来防止保留周期。 用户点击“后退”, UIViewController被取消分配。 迟早,callback块得到执行>> BAD ACCESS 在iOS 4之前,我们处理这种情况的方法是将…设置为nil我所知的delegate属性,无论您使用的是什么类。 但是现在…你怎么取消一个区块呢? 如果块被发送到一个静态方法,你没有办法消除这个callback引用? 在这种情况下,我们是否应该避免使用“自我”的代理? 顺便说一句,“自我”的代理人,我的意思是说: __block typeof(self) bself = self; 谢谢!!

BOOL方法在块内部不返回YES

我创build了一个返回BOOL的新方法,如下所示。 +(BOOL)checkIfGameAlreadyExistsAgainst:(PFUser *)opponentUser { // Find all the games where the current user is user1 and the opponentUser is user2 PFQuery *currentUserIsUser1 = [PFQuery queryWithClassName:@"Game"]; [currentUserIsUser1 whereKey:kMESGameUser1 equalTo:[PFUser currentUser]]; [currentUserIsUser1 whereKey:kMESGameUser2 equalTo:opponentUser]; [currentUserIsUser1 whereKey:kMESGameIsActive equalTo:[NSNumber numberWithBool:YES]]; [currentUserIsUser1 findObjectsInBackgroundWithBlock:^(NSArray *objects, NSError *error) { if (objects) { // We have games where the current user is user1 […]

UIImagePickerController在ios7中没有显示(需要更多时间来加载)相机预览

我在我的应用程序中使用GCD在后台队列中获取大量图像和数据,当我展示uiimagepickercontroller时,需要更多时间来显示相机预览。 search后,我发现很多人都面对iOS 7的这个问题,这里有一个更有意义的post。 ( iOS 7的UIImagePickerController相机没有图像 )。 解决scheme是停止后台线程,然后出现select控制器。 但我真的难住,不知道如何停止或暂停后台线程,呈现select控制器,然后恢复/启动后台线程。 有人可以帮助我这个。 下面是我如何在我的networking课堂(和其他人一样)获取图像和数据的背景。 我的串行队列是这样初始化的。 sharedInstance.serialQueue = dispatch_queue_create("user-detail-queue", DISPATCH_QUEUE_CONCURRENT); 而在后台取东西的代码就是这样的。 dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^{ NSString *myUserID = [JNKeychain loadValueForKey:@"userID"]; NSString *sessionToken = [JNKeychain loadValueForKey:@"sessionToken"]; if(sessionToken && myUserID) { dispatch_async([BGNetworkAPI sharedInstance].serialQueue, ^{ id object = [[BGNetworkAPI sharedInstance].userCache objectForKey:myUserID]; if(object) { NSDictionary *cachedResponseDictionary = (NSDictionary *)object; BGUser *user = [BGUser createUserWithResponseDictionary:cachedResponseDictionary]; […]

使用块和ARC导致“消息发送到解除分配的实例”错误

我遇到了ARC和块的问题,但解决了这个问题。 不幸的是,我不知道究竟发生了什么,想了解更多的情况。 原来,我有这样做的代码 for(__block id<Foo> object in objects) { foo download:someParm success:^{ object.state = StateNewState; } ]; } 这导致了保留的不平衡。 一个对象被访问时发生崩溃,并且被认为已经被释放。 我写了一个实现并使用“copy”属性的类来创build一个successBlock属性,该属性保存了传递给下载函数成功参数的块。 我用下面的代码replace了这个代码 for(id<Foo> object in objects) { foo download:someParm success:^(id<Foo> successObject){ successObject.state = StateNewState; } ]; } 没有更多的释放对象错误,但我还没有运行仪器来检查是否没有泄漏。 有些如何使用__block导致对象被释放太多次,我不明白为什么。 我会继续研究这个问题的原因,但是我认为这对其他人来说是一个有趣的问题。 我想可能值得注意的是objects数组是一个autoreleased数组,它是在我之前在这篇文章中写下的代码行中创build的。 不要以为这会很重要,但我认为我只是通过那里。 我放在这篇文章中的代码并不是确切的代码,因为我正在使用这个工作,并且里面有一堆绒毛。 但是for循环中没有创build其他对象。 当应用程序崩溃,它运行下载,然后运行callback,顺便说一句,我使用ASIHttp。 当我试图再次下载它运行和callback不会被调用,因为对象已被释放,委托没有。 之后,当对象被包含指向对象的指针的字典访问时,我们会崩溃。