2011-04-23 1 views
0

다시 한 번 나는 인터넷에 온 것입니다. :)클래스 메서드를 사용하여 NSArray 생성하기

내가 채워진 배열에 요소 이외의 배열이 포함 반환하는 클래스 메소드를 사용하려고 해요 :

.H :

@interface NetworkData : NSObject { 

} 

    +(NSString*) getCachePath:(NSString*) filename; 
    +(void) writeToFile:(NSString*)text withFilename:(NSString*) filePath; 
    +(NSString*) readFromFile:(NSString*) filePath; 
    +(void) loadParkData:(NSString*) filename; 
    +(NSArray*) generateColumnArray:(int) column type:(NSString*) type filename:(NSString*) filename; 

@end 

하는 .m :

#import "NetworkData.h" 
#import "JSON.h" 
#import "Utility.h" 


@implementation NetworkData 

+(NSString*) getCachePath:(NSString*) filename { 
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
    NSString *cachePath = [NSString stringWithFormat:@"%@/%@", [paths objectAtIndex:0], filename]; 
    [paths release]; 
    return cachePath; 
} 

+(void) writeToFile:(NSString*)text withFilename:(NSString*) filename { 
    NSMutableArray *array = [[NSArray alloc] init]; 
    [array addObject:text]; 
    [array writeToFile:filename atomically:YES]; 
    [array release]; 
} 

+(NSString*) readFromFile:(NSString*) filename { 
    NSFileManager* filemgr = [[NSFileManager alloc] init]; 
    NSData* buffer = [filemgr contentsAtPath:filename]; 
    NSString* data = [[NSString alloc] initWithData:buffer encoding:NSUTF8StringEncoding]; 
    [buffer release]; 
    [filemgr release]; 
    return data; 
} 

+(void) loadParkData:(NSString*) filename { 
    NSString *filePath = [self getCachePath:filename]; 
    NSURL *url = [NSURL URLWithString:@"http://my.appserver.com"]; 
    NSData *urlData = [NSData dataWithContentsOfURL:url]; 
    [urlData writeToFile:filePath atomically:YES]; 
} 

+(NSArray*) generateColumnArray:(int) column type:(NSString*) type filename:(NSString*) filename { 
    // NSLog(@"generateColumnArray called: %u %@ %@", column, type, filename); 
    // productArray = [[NSMutableArray alloc] init]; 
    // NSString *filePath = [self getCachePath:filename]; 
    // NSString *fileContent = [self readFromFile:filePath]; 
    // NSString *jsonString = [[NSString alloc] initWithString:fileContent]; 
    // NSDictionary *results = [jsonString JSONValue]; 
    // NSArray *eventsArray = [results objectForKey:type]; 
    // NSInteger* eventsArrayCount = [eventsArray count]; 
    // NSInteger* a; 

    // for (a = 0; a < eventsArrayCount; a++) { 
    //  NSArray *eventsColSrc = [eventsArray objectAtIndex:a]; 
    //  NSArray *blockArray = [eventsColSrc objectAtIndex:column]; 
    //  [productArray addObject:blockArray]; 
    //  [blockArray release]; 
    // } 

    // [eventsArray release]; 
    // [results release]; 
    // [jsonString release]; 
    // [fileContent release]; 
    // [filePath release]; 

    // [a release]; 
    // [eventsArrayCount release]; 

    // return productArray; 
    } 

-(void)dealloc { 
    [super dealloc]; 
} 

@end 

.. 및 전화 :

NSArray* dataColumn = [NetworkData generateColumnArray:0 type:@"eventtype_a" filename:@"data.json"]; 

메서드 내의 코드가 작동합니다 (예쁘지 않습니다, 알고 있습니다 - 직장에서 멍청한 놈). 그것은 본질적으로 부끄럽지 않습니다. (액티브 코드가없는 것처럼) 호출하면 스플래시 화면에서 다른 것을 표시하기 전에 앱이 종료됩니다.

나는 이것이 머리 끄는 사람이라고 내기하고 있습니다 - 당신이 떨어 뜨릴 수있는 지식에 대해 많은 감사드립니다.

답변

0

앱이 충돌하는 경우 콘솔에 이유를 설명하는 메시지가 표시 될 가능성이 큽니다. 도움을 청할 때 그 메시지를 포함시키는 것이 항상 도움이됩니다.

하나의 분명한 문제는 + generateColumnArray ... 메소드가 NSArray에 대한 포인터를 반환한다고 가정하지만 메소드의 모든 코드가 주석 처리 된 상태에서 아무 것도 반환하지 않으며 who- knowows - what is dataColumn에 할당 메소드의 끝에 return nil;을 추가하고 충돌이 수정되는지 확인하십시오. 다시 말하지만 오류 메시지를보고 코드가 왜 비정상적으로 작동 하는지를 확인하십시오. 그러면 솔루션으로 연결됩니다.

+0

콘솔에 아무것도 없습니다. 그게 저를 왜곡 시켰습니다 ... 스프링 보드로 떨어졌습니다. "nil"을 반환해도 아무런 차이가 없습니다. 팁을 주셔서 감사합니다 ... – JSpread

+0

그래서, 첫 번째 문제는 (물론) 메모리 관리였습니다 ... @interface의 일반적인 조정으로 고쳐졌습니다. 이제 메서드는 데이터를 반환하고 충돌이 발생합니다. 드로잉 보드로 돌아 가기! – JSpread

0

음, 주석 처리 된 코드에서 유효한 값을 반환하지 않습니다. 다음에 'dataColumn'을 어떻게 사용합니까? 디버거에서 실행하면 문제를 바로 지적해야합니다. 그렇지 않습니다.

+0

현재 사용되는 것은 NSLog뿐입니다. 배열에는 일곱 개의 객체가 포함되어야하지만, NSLog 결과의 인덱스 0과 3에있는 객체가 내려 가기 직전에 나타납니다. 오 잘 - 나는 그것을 이해하는 긴 주말을 보낸다. :) – JSpread

+0

또한 [[NSFileManager alloc] init]을 사용한 적이 없습니다. 대신 [NSFileManager defaultManager]를 사용하십시오. 또한 readFromFile :에서 'buffer'를 해제하지 마십시오. ('버퍼'는 자동으로 릴리즈됩니다.) – nielsbot