Tag: objective c blocks

我是否必须在Objective-C for iOS中保留块?

我想要做一个方法,在一个块中,将其保存在一个成员,启动一个asynchronous任务,然后在asynchronous调用完成callback时调用块。 我必须保留这个块吗? 块内存是否像其他对象一样pipe理? 我可以合成一个属性来保存块吗?

可以使用__weak属性传递参数块导致内存泄漏?

在我支持iOS的ARC代码中,我需要将“self”和其他对象传递给一个块。 更具体地说,我需要在ASIHTTPRequest的completionBlock内部与self和一个ASIHTTPRequest对象进行交互。 _operation = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(parseServerReply) object:nil]; _request = [ASIHTTPRequest requestWithURL:@"server.address"]; // … [_request setCompletionBlock:^{ [self setResponseString:_request.responseString]; [[MyAppDelegate getQueue] addOperation:_operation]; }]; 为了避免以下警告: Capturing "self" strongly in this block will likely lead to a retain cycle 。 我已经修改了我的代码,以添加__weak属性在这个post后面的块中使用的对象: 修复警告“在该块强烈捕获[一个对象]很可能导致一个保留周期”在启用ARC的代码 结果代码是: _operation = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(parseServerReply) object:nil]; _request = [ASIHTTPRequest requestWithURL:@"server.address"]; // … __weak […]

用块replace委托方法的最佳技术

我正在寻找创build一个类别来取代委托方法与许多简单的iOS API的callback块。 类似于NSURLConnection上的sendAsyc块。 有2种技术是无泄漏的,似乎工作正常。 各有什么优点/缺点? 有没有更好的办法? 选项1.使用一个类别在NSObject上实现委托的callback方法,并将外部callback块作用域。 // Add category on NSObject to respond to the delegate @interface NSObject(BlocksDelegate) – (void) alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex; @end @implementation NSObject(BlocksDelegate) – (void) alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex { // Self is scoped to the block that was copied void(^callback)(NSInteger) = (id)self; // Call the callback passed if callback(buttonIndex); [self release]; […]

正确pipe理addObserverForName:object:queue:usingBlock:

我仍然是新来的块在objective-c,并想知道如果我有这个伪代码正确。 我不确定是否足以删除观察者,或者我必须调用removeObserver:name:object: -(void) scan { Scanner *scanner = [[Scanner alloc] init]; id scanComplete = [[NSNotificationCenter defaultCenter] addObserverForName:@"ScanComplete" object:scanner queue:nil usingBlock:^(NSNotification *notification){ /* do something */ [[NSNotificationCenter defaultCenter] removeObserver:scanComplete]; [scanner release]; }]; [scanner startScan]; } 更新:我从这个块中收到间歇性的EXC_BAD_ACCESS ,所以这是不对的。

块执行后返回null的variables

我正在调度一个队列,在一个单独的线程(在viewWillAppear)下载一些flickr照片。 当我在块内logging数组的内容时,它完美地显示了一切: dispatch_queue_t photoDowonload=dispatch_queue_create("photoDownload", NULL); dispatch_async(photoDowonload, ^{ NSArray *photoList=[FlickrFetcher topPlaces]; //downloads flickr data self.listOfCities=photoList; NSLog(@"inside block: %@", self.listOfCities); //shows contents }); 但是当我尝试logging在块外部的块内设置的数组时,它将返回null。 dispatch_queue_t photoDowonload=dispatch_queue_create("photoDownload", NULL); dispatch_async(photoDowonload, ^{ NSArray *photoList=[FlickrFetcher topPlaces]; self.listOfCities=photoList; }); NSLog(@"after block: %@", self.listOfCities); //returns null 这里有什么问题? self.listOfCities被设置为NSArray属性,所以一旦在块中设置,它应该可以在其外部访问。

__blockvariables在块运行后返回nil

我创build了一个string,我已经用__block标识符作为前缀,以便能够在我的块外部访问该variables。 但是,一旦我尝试运行应用程序variables返回'零': -(void)downloadParcelData { __block NSString *test; MKMapRect mRect = self.mapView.visibleMapRect; NSArray *array = [NSArray array]; array = [self getBoundingBox:mRect]; NSString *polygonString = [self convertCoordinates:array]; AFHTTPSessionManager *manager = [AFHTTPSessionManager manager]; manager.responseSerializer.acceptableContentTypes = nil; NSDictionary *parameters = @{@"client" : @"xxxxxxxxxx", @"spatial_intersect" : [NSString stringWithFormat:@"POLYGON((%@))", [polygonString stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLHostAllowedCharacterSet]]]}; [manager GET:@"someURL" parameters:parameters progress:nil success:^(NSURLSessionTask *task, id responseObject) { […]

如果从块中调用的方法使用自我,我是否需要使用弱自我指针?

使用self. 在块中导致保留周期,所以我需要创build一个weakSelf的引用。 我明白这一点 但! 如果从我的块我调用一个方法,使用self “,这是否也导致保留周期?例​​如,如果我重新加载UITableView从一个块和我的一些UITableView委托方法我self.这是否意味着我必须到处传递这个薄弱的参考?

只有发布版本,iOS 5才会崩溃

我有使用块和ARC,并发现在某些情况下,iOS版本只在发布版本崩溃。 这样写代码是错误的。 -(IBAction)clickedButtonA:(UIBarButtonItem*)sender event:(UIEvent*)event { NSMutableArray *arrRows = [NSMutableArray arrayWithCapacity:0]; #warning this code only crash on Release Build…. Don't use this NSMutableDictionary * dicRow = [NSMutableDictionary dictionaryWithCapacity:0]; [arrRows addObject:dicRow]; dispatch_block_t block = ^{ NSString *str = [NSString stringWithFormat:@"%@",[_tweet valueForKey:@"text"]]; [[UIPasteboard generalPasteboard] setString:str]; }; [dicRow setValue:block forKey:kDicKeyLinkPopBlock]; NSMutableArray *sections = [NSMutableArray arrayWithObject:arrRows]; TOVLinkPopoverViewController *controller= [[TOVLinkPopoverViewController alloc] […]

我可以用addOperationWithBlock取消添加到NSOperationQueue的Block吗?

我读了许多文章说“块是未来!!!”。 我想知道它是否涉及到在后台运行操作。 例如,我有一个表格视图,其中有来自networking的图像。 现在我可以使用+[NSOperationQueue addOperationWithBlock:]来获取它们。 当单元格变为可见时,会将操作发送到队列。 但有一种方法可以取消它,一旦细胞滚动屏幕? 或者是唯一的方法来做到NSOperation子类? 使用块很容易,所以我只是在我试图解决这个 NSOperation子类的例子之前问这个问题…

方法BOOL从块内返回

我正在尝试将Beeblex的新应用内购买validation添加到我的应用,但是我正在努力从一个块内传递一个返回值。 这里是我现在的代码,正如你所看到的,我设置一个BOOL值,然后在validation块内设置BOOL,并在最后返回它。 不过最后的返回在块结束前被调用,所以我需要的是从块内返回BOOL? – (BOOL)verifyTransaction:(SKPaymentTransaction *)transaction { if (![BBXIAPTransaction canValidateTransactions]) { return YES; // There is no connectivity to reach the server } BOOL __block toReturn = YES; BBXIAPTransaction *bbxTransaction = [[BBXIAPTransaction alloc] initWithTransaction:transaction]; bbxTransaction.useSandbox = YES; [bbxTransaction validateWithCompletionBlock:^(NSError *error) { if (bbxTransaction.transactionVerified) { if (bbxTransaction.transactionIsDuplicate) { // The transaction is valid, but duplicate – […]