Tag: objective c blocks

块获取释放,而在NSDictionary(ARC)

我试图保留一个Block的引用,这个Block被一个方法传递给我的类,稍后再调用。 我遇到了麻烦,但是保持对它的引用。 我认为,显而易见的方法是将其添加到伊娃集合中,所有这些都应该对其内容保持强有力的引用。 但是,当我试图把它拉回来,它是零。 代码非常简单: typedef void (^DataControllerCallback)(id rslt); @interface DataController : NSObject { NSMutableArray* queue; } – (void) addBlock:(DataControllerCallback)callback; – (void) functionToBeCalledLater; @end @implementation DataController – (id) init { self = [super init]; if (self != nil) { queue = [NSMutableArray new]; } return self; } – (void) addBlock:(DataControllerCallback)callback { NSDictionary* toAdd = [NSDictionary […]

如何使用NSURLSession从块获取数据?

我有这个块的问题。 我试图获取NSURLSession块内的数据。 这是我的代码 -(NSDictionary *) RetrieveData{ NSURLSession * session = [NSURLSession sharedSession]; NSURL * url = [NSURL URLWithString: self.getURL]; dataList =[[NSDictionary alloc] init]; NSURLSessionDataTask * dataTask = [session dataTaskWithURL:url completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) { self.json = [NSJSONSerialization JSONObjectWithData:data options:0 error:nil]; }]; return self.dataList; [dataTask resume]; } 是否有可能获得NSURLSession块内的数据?

强烈引用块内部弱引用

为什么有必要强调一个块内的弱引用? 我明白,在块内有一个弱引用将避免保留周期。 但是,为什么还要再强烈地提到弱者呢? 背景: 正如梅森所描述的,这是最好的做法。 我知道在块内引用自我的正确方法是在块外创build一个弱引用,然后在块内引用弱引用[…] 例: __weak typeof(self) weakSelf = self; void (^someBlock)(id) = ^(id data){ typeof(self) strongSelf = weakSelf; // code using strongSelf });

将字块中的块保留

我有我自己的方法,把块作为一个参数。 我想跟踪在NSDictionary内的块。 将字块添加到字典的最佳方法是什么? 我试过这个代码,但执行下面的行(setObject …)后,字典仍然是空的。 我认为这是因为该块不是NSObjecttypes。 但是,这样做的正确方法是什么? – (void)startSomething:(NSURLRequest*)request block:(void (^)(NSURLResponse*, NSData*, NSError*))handler { NSURLConnection *connection = [NSURLConnection connectionWithRequest:request delegate:self]; [pendingRequests setObject:handler forKey:connection]; } 编辑: 没关系。 我不知道我在想什么。 3分: 块是objc对象 Typo:setObject应该是setValue forKey是一个string,所以它应该是[连接描述]或类似的东西 无论如何,我现在解决我的问题是这样的: – (void)startSomething:(NSURLRequest*)request block:(void (^)(NSURLResponse*, NSData*, NSError*))handler { NSURLConnection *connection = [NSURLConnection connectionWithRequest:request delegate:self]; [pendingRequests setValue:handler forKey:[connection description]]; } – (void)connectionDidFinishLoading:(NSURLConnection *)connection { dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, […]

如何解决在这个区块强烈的“捕捉”区块可能会导致一个保留周期“

我正在处理这个代码,它在网上做了一些冗长的asynchronous操作,当它完成时,它会触发一个完成块,在那里执行一些testing,如果一个variables获得了一个特定的值,另一个冗长的操作应该立即开始: -(void) performOperation { void(^completionBlock) (id obj, NSError *err, NSURLRequest *request)= ^(id obj,NSError *err, NSURLRequest *request){ int variable=0; // Do completion operation A //… //… // Do completion operation B //Get the variable value if(variable>0){ [self doLengthyAsynchronousOperationWithCompletionBlock: completionBlock]; } }; //Perform the lenhgty operation with the above completionBlock [self doLengthyAsynchronousOperationWithCompletionBlock: completionBlock]; } -(void) doLengthyAsynchronousOperationWithCompletionBlock: completionBlock […]

在这个区块强烈捕捉“自我”可能会导致一个保留周期

我有块要求。 但编译器发出警告 “在这个区块强烈地捕捉”自我“可能会导致一个保留周期” __weak typeof(self) weakSelf = self; [generalInstaImage setImageWithURLRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:data[@"images"][@"low_resolution"][@"url"]]] placeholderImage:[UIImage imageNamed:@"Default"] success:^(NSURLRequest *request, NSHTTPURLResponse *response, UIImage *image) { NSLog(@"success"); [generalInstaImage setImage: image]; [weakSelf saveImage:generalInstaImage.image withName:data[@"id"]]; } failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error) { NSLog(@"fail"); }]; 我尝试写例如weakSelf.generalInstaImage示例,但编译器生成一个错误,不编译。

ios中block(Objective C)和closure(Swift)之间的区别

在教程中,它的function都相同,即使闭包更容易,然后阻止和它避免了块和内存pipe理的复杂性,我已经经历了许多教程,但除了这些我没有得到区别之间的swift的“封闭” Objective-C“块”。 任何人都可以深入解释这种差异。 任何帮助,将不胜感激。

将Objective-C块定义为属性 – 最佳实践

我最近遇到了一个Apple文档 ,显示了以下块的属性声明: @interface XYZObject : NSObject @property (copy) void (^blockProperty)(void); @end 另外,这篇文章指出: 注意:您应该指定copy作为属性属性,因为需要复制一个块以跟踪其捕获的状态超出原始范围。 这不是您使用自动引用计数时需要担心的事情,因为它会自动发生,但是最好的做法是使用property属性来显示结果行为。 有关更多信息,请参阅块编程主题。 我也读了build议的块编程主题,但没有发现任何相关的东西。 我仍然很好奇,为什么将块属性定义为“复制”是最佳实践。 如果你有一个很好的答案,请尝试区分ARC和MRC的差异,如果有的话。 谢谢

可以在没有__weak对象(iOS 5 + ARC)的情况下通过

是否可以传递[self的任何function]块没有__weak对象从自我? 作为一个例子,这是来自System Framework的有效代码: [UIView animateWithDuration:0.8 animations:^{ //Do animationStuff } completion:^(BOOL finished) { [self anyFunction]; }]; 您可以在完成块中传递[self anyFunction]而不发出警告。 但是,如果您使用完成块编写自己的方法,则会发生以下警告: 在此块中强烈捕获“自我”可能会导致保留周期 。 一个可行的解决scheme非常简单(iOS 5 + ARC)。 在块声明之前: __weak MyClass *weakSelf = self; 并在完成块,你必须打电话: [weakSelf anyFunction]; 但是,回到我的问题:为什么没有必要在系统框架API中使用__weak对象,并使用self没有任何警告。 以及如何在块中实现一个方法,而不需要__weak对象? 感谢你的付出。

使用RestKit进行同步HTTP调用

当将用户login到我的应用程序中时,我需要仅使用用户名从服务器拉下用户对象。 这将返回userId(除其他外),以​​便进行其他API调用。 从那一刻起,我将使用userId进行一些其他的HTTP调用。 在发送其他呼叫之前,如何使同步呼叫完全拉下用户对象? 我已经在我的应用程序委托类中设置了我的对象映射,它完美地工作,并使用此代码从服务器拉下用户对象: [[RKObjectManager sharedManager] loadObjectsAtResourcePath:[@"/api/users/" stringByAppendingString:[_userNameField text]] delegate:self]; 这就是我已经尝试过…这里build议: 使用RestKit进行同步调用 RKObjectLoader* loader = [[RKObjectManager sharedManager] objectLoaderForObject:currentUser method:RKRequestMethodPUT delegate:nil]; RKResponse* response = [loader sendSynchronously]; 然而,这个代码(1)使用了不赞成使用的方法objectLoaderForObject,并且(2)崩溃说'Unable to find a routable path for object of type '(null)' for HTTP Method 'POST'' 。