2010-10-18 51 views
1

我有一个视图控制器是NSStreamDelegate,当视频从导航控制器弹出而某些内容正在流式传输时出现问题,我得到一个“EXC_BAD_ACCESS”错误。我试图关闭流,但它似乎并没有阻止它,如果有一个流正在进行。处理这个问题的正确方法是什么?如果某些事情正在流传,你能否延缓观点的发作?NSStream在阅读时发布,“EXC_BAD_ACCESS”iPhone SDK

#import "CameraViewer.h" 

@implementation CameraViewer 
@synthesize camService; 
@synthesize currentDownload; 

// The designated initializer. Override if you create the controller programmatically and want to perform customization that is not appropriate for viewDidLoad. 
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil theService:(NSNetService *)cameraService { 
    if ((self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil])) { 
     // Custom initialization 
     [self setCamService:cameraService]; 
    } 
    return self; 
} 



// Implement viewDidLoad to do additional setup after loading the view, typically from a nib. 
- (void)viewDidLoad { 
    [super viewDidLoad]; 
    [self downloadAgain]; 
} 

- (void)viewWillDisappear:(BOOL)animated{ 
    NSLog(@"view is going away"); 
    NSInputStream *istream; 
    [camService getInputStream:&istream outputStream:nil]; 
    [istream close]; 
    NSLog(@"view is gone"); 
    [super viewWillDisappear:animated]; 
} 


- (void)downloadAgain{ 
     NSInputStream *istream; 
     [camService getInputStream:&istream outputStream:nil]; 
     [istream retain]; 
     [istream setDelegate:self]; 
     [istream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode]; 
     [istream open]; 
} 

#pragma mark NSStream delegate method 

- (void)stream:(NSStream *)aStream handleEvent:(NSStreamEvent)event { 
     switch(event) { 
      case NSStreamEventHasBytesAvailable: 
       NSLog(@"Reading Stream"); 
       if (![self currentDownload]) { 
        [self setCurrentDownload:[[NSMutableData alloc] initWithCapacity:409600]]; 
       } 
       uint8_t readBuffer[4096]; 
       int amountRead = 0; 
       NSInputStream * is = (NSInputStream *)aStream; 
       amountRead = [is read:readBuffer maxLength:4096]; 
       [[self currentDownload] appendBytes:readBuffer length:amountRead]; 
       //NSLog(@"case 1"); 
       break; 
      case NSStreamEventEndEncountered: 
       [(NSInputStream *)aStream close]; 
       UIImage *newImage = [[UIImage alloc] initWithData:[self currentDownload]]; 
       [self setCurrentDownload:nil]; 
       if(newImage != nil){ 
        [imageView setImage:newImage]; 
       } 
       [newImage release]; 
       [self performSelector:@selector(downloadAgain) withObject:nil afterDelay:0.25]; 
       break; 
      default: 
       break; 
     } 
} 

// Override to allow orientations other than the default portrait orientation. 
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { 
    return YES; 
} 


- (void)didReceiveMemoryWarning { 
    // Releases the view if it doesn't have a superview. 
    [super didReceiveMemoryWarning]; 

    // Release any cached data, images, etc that aren't in use. 
} 

- (void)viewDidUnload { 
    [super viewDidUnload]; 
    // Release any retained subviews of the main view. 
    // e.g. self.myOutlet = nil; 
} 


- (void)dealloc { 
    [[self camService] release]; 
    [[self currentDownload] release]; 
    [super dealloc]; 
} 


@end 
+0

发布您的代码。 – 2010-10-18 19:08:11

+0

我发布了代码。 – Matt 2010-10-19 00:50:47

回答

0

我看到你拨打scheduleInRunLoop。在这种情况下,当你不需要流,你也应该叫

[istream removeFromRunLoop:[NSRunLoop currentRunLoop] 
        forMode: NSDefaultRunLoopMode]; 

您已经关闭了流之后。

0

发生了什么是CameraViewer类(它被设置为委托)的任何实例正在被释放(导致运行循环中出现EXC_BAD_ACCESS),因为您没有保留它。

的解决方案是呼吁CameraViewer类保留在实例化,就像这样:

CameraViewer *cameraViewer = [[CameraViewer alloc] init]; 
[cameraViewer retain];