ivar 在 ARC 下发布 - 我如何保留它以用于另一种方法?

Posted

技术标签:

【中文标题】ivar 在 ARC 下发布 - 我如何保留它以用于另一种方法?【英文标题】:ivar is releasing under ARC - how do I retain it for use in another method? 【发布时间】:2012-07-17 19:51:14 【问题描述】:

我已经为某事苦苦挣扎了好几个星期,这确实阻碍了我的进步。我已经在 SO 上问了几次问题,人们一直很有帮助,但没有人破解我做错了什么。这似乎是一件相当简单的事情,所以希望有人在那里有一个灯泡时刻并解决这个问题。我正在实现一个 TWRequest,结果在字典中返回,我正在循环遍历结果以提取推文的一部分并创建这些“文本”组件的数组。直接通过循环,我正在对数组的日志进行调整 - _twitterText 并且它打印得很好。在这个方法完成之后,看起来好像 _twitterText 正在被转储。我在我的 .h 文件中将它创建为一个强大的属性,并在 viewdidload 中创建了一个 ivar。仍然没有喜悦。 如何保留此数组以在其他方法中使用? 这是我的 .h 文件....

#import <UIKit/UIKit.h>
#import <CoreLocation/CoreLocation.h>
#import "CustomCell.h"
#import "AppDelegate.h"
#import <Twitter/Twitter.h>

@interface MyViewController : UITableViewController <CLLocationManagerDelegate>

    CLLocationManager *here;


@property(strong) NSDictionary *dict;
@property(strong) CLLocationManager *here;
@property (strong, nonatomic) NSMutableArray *twitterText;

- (void)fetchTweets;

@end </p>

这是我的.m实现文件......

#import "MyViewController.h"

@interface MyViewController ()

@end

@implementation MyViewController
@synthesize dict;
@synthesize twitterText = _twitterText;

- (id)initWithStyle:(UITableViewStyle)style

    self = [super initWithStyle:style];
    if (self) 
        // Custom initialization
    
    return self;


- (void)viewDidLoad

    [super viewDidLoad];

    _twitterText = [[NSMutableArray alloc] init];



    here = [[CLLocationManager alloc] init];
    here.delegate = self;
    [here startUpdatingLocation];



    AppDelegate *delegate = (AppDelegate*)[[UIApplication sharedApplication]delegate];

    NSLog(@"phrase carried over is %@", delegate.a);


    [self fetchTweets];



- (void)fetchTweets

    TWRequest *request = [[TWRequest alloc] initWithURL:[NSURL URLWithString:
                                                         @"http://search.twitter.com/search.json?q=%40wimbledon"] 
                                             parameters:nil requestMethod:TWRequestMethodGET];


    [request performRequestWithHandler:^(NSData *responseData, NSHTTPURLResponse *urlResponse, NSError *error)
     
         if ([urlResponse statusCode] == 200) 
         
             // The response from Twitter is in JSON format
             // Move the response into a dictionary and print
             NSError *error;        
             NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:responseData options:0 error:&error];
             //NSLog(@"Twitter response: %@", dict);

             NSArray *results = [dict objectForKey:@"results"];


             //Loop through the results
 for (NSDictionary *tweet in results) 
                 // Get the tweet
                 NSString *twittext = [tweet objectForKey:@"text"];

                 // Save the tweet to the twitterText array
                 [_twitterText addObject:twittext];
             



             NSLog(@"MY ************************TWITTERTEXT************** %@", _twitterText);


         

         else
             NSLog(@"Twitter error, HTTP response: %i", [urlResponse statusCode]);
     ];




- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView

#warning Potentially incomplete method implementation.
    // Return the number of sections.
    return 1;


- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section

#warning Incomplete method implementation.
    // Return the number of rows in the section.
    return 5;


- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

    static NSString *CellIdentifier = @"MyCell";
    CustomCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];



    // Configure the cell...
   //cell.venueDetails.text = [_twitterText objectAtIndex:indexPath.row]; 
   NSLog(@"MY ************************OTHER BIT THAT WONT PRINT************** %@", _twitterText);
    return cell;

【问题讨论】:

快速健全性检查:您可以在每种情况下登录 _twitterText 之前登录NSLog(@"i am %@",self) 嗨 Firoze,我在两种情况下都能完美打印日志 - “ 您确定它们按您期望的顺序打印吗? fetchTweets 触发一个异步请求。它可以很容易地完成之后 tableView:cellForRowAtIndexPath: 是的,此外,如果我取消注释 live"cell.venueDetails.text = [_twitterText objectAtIndex:indexPath.row];"由于 _twitterText 是一个空数组,我得到了一个 SIGABRT 在 http 调用完成之前,该完成处理程序无法完成其工作。所以这里的正常模式是在tableView:numberOfRowsInSection: 中返回零(或某个占位符),直到你真正有内容要显示。当您有内容要显示时(在服务器响应后),重新加载表格并返回正确的行数和每行的单元格。 【参考方案1】:

所以这里的问题是,在网络连接完成并且服务器响应您的请求之前,您传递给 -[TWTweet performRequestWithHandler:] 的完成处理程序不会(不能)触发。这可能需要数百毫秒甚至几秒钟才能完成。 (或者它可能永远不会发生)。

与此同时,UITableView 想要绘制自己,因此会询问您有多少个部分/行,然后会要求您为每一行提供一个单元格。因此,当表格视图询问时,您应该返回当时必须绘制的实际行数

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section

    // Return the number of rows in the section.
    return [self.twitterText count]; // the actual number of rows we have right now

因此,您需要的下一步是在您的数据实际来自服务器时重新加载表。这将提示您的表格视图再次询问节数和行数,然后询问每个节和行的单元格。因此,在您处理完所有数据后,您需要在完成块的某个位置执行以下操作:

dispatch_async(dispatch_get_main_queue(), ^

  // you'll need an outlet to the UITableView
  // here I assume you call that 'tableView'
  // then just ask it to reload on the main thread

  [self.tableView reloadData];

);

希望对你有帮助?

【讨论】:

太棒了。你是个传奇!!非常感谢 - 我已经快速完成了,它似乎以正确的顺序发射

以上是关于ivar 在 ARC 下发布 - 我如何保留它以用于另一种方法?的主要内容,如果未能解决你的问题,请参考以下文章

如何在不等待回复的情况下发布表单

如何在不模拟多部分表单的情况下发布图像[重复]

如何在特定 jwt 上下文下发出发布请求 webclient

Ajax 和 JavaScript,如何在不使用 JQuery 的情况下发布数组?

如何在没有 Visual Studio 的情况下发布 ASP.NET Web API?

Facebook API:如何在不登录的情况下发布到自己的应用程序墙