2012-07-11 57 views
4

我閱讀這篇文章:http://weakreference.wordpress.com/2011/06/22/overriding-nslog-on-ios/在prefix.pch中覆蓋NSLOG IOS

本文的想法是將這兩個東西添加到您的應用程序的prefix.pch文件,以便您可以覆蓋NSLog的行爲。

的兩件事情我加入是:

#define NSLog(...) customLogger(__VA_ARGS__); 

void customLogger(NSString *format, ...) { 
    va_list argumentList; 
    va_start(argumentList, format); 
    NSMutableString * message = [[NSMutableString alloc] initWithFormat:format 
     arguments:argumentList]; 

    [message appendString:@"Our Logger!"]; // Our custom Message! 
    NSLogv(message, argumentList); // Originally NSLog is a wrapper around NSLogv. 
    va_end(argumentList); 
    [message release]; 
} 

Xcode中拋出一個錯誤的比賽-O錯誤,它找到customLogger的副本。

有沒有人成功覆蓋NSLog?

謝謝!

編輯迴應羅布:

好,太好了。我們正在取得進展!我就像你問的那樣移動了東西。下面是我們現在有:

我的自定義記錄器:

void customLogger(NSString *format, ...) { 

    va_list args; 
    va_start(args, format); 
    va_end(args); 
    [newLogger log:format withArgs:args]; 
} 

//This is a newLogger Method 
+ (void) log:(NSString *)format withArgs:(va_list) args{ 

    NSArray *occ = [format componentsSeparatedByString:@"%@"]; 

    NSInteger characterCount = [occ count]; 

    NSArray *stringItems = [format componentsSeparatedByString:@"%@"]; 

    NSMutableString *tmp = [[NSMutableString alloc] initWithFormat: @"%@",[stringItems objectAtIndex:0]]; 

    for(int i = 1; i < characterCount; i++) { 
     NSString *value = va_arg(args, NSString *); 
     [tmp appendString:value]; 
     [tmp appendString:[stringItems objectAtIndex:i]]; 
    } 

    // Need to alter the above and actually do something with the args! 
    [tmp appendString:@"\n"]; 
    [[newLogger sharedInstance].logBuffer appendString:tmp]; 

    if ([newLogger sharedInstance].textTarget){ 
     [[newLogger sharedInstance].textTarget setText:sharedInstance.logBuffer]; 
    } 
} 

當我打電話+日誌,我得到線程一個SIBABRT錯誤1.

回答

5

聽起來好像你在.pch文件中定義customLogger 。這意味着每個.m文件都包含它,因此您的項目創建的每個.o文件都包含自己的customLogger副本。這就是爲什麼你會從鏈接器中獲得重複的符號定義錯誤。

你只是需要申報customLogger.pch,就像這樣:

void customLogger(NSString *format, ...); 

,並創建一個customLogger.m文件包含的定義。

+0

好的,那是有效的......部分。 現在,我要重寫NSLOG。這意味着,我放了一行:#define NSLog(...)customLogger(__ VA_ARGS__);,然後在自定義記錄器函數中執行: void customLogger(NSString * format,...){ va_list ARGS; \t va_start(args,format); \t va_end(args); [newLogger log:format withArgs:args]; } ..這將獲取所有傳遞給NSLog的數據,並將它們發送到我的newLogger。 - 做這些事情給我一個神祕的崩潰,那就是線程1上的SIGABRT。 – Jeff 2012-07-12 14:01:49

+2

在調用'newLogger'之後,你需要調用'va_end',而不是之前。 – 2012-07-12 15:16:54

-1

試試這個代碼。它覆蓋NSLog。下面寫在類名,Prefix.pch文件代碼在最後

#ifdef DEBUG 
# define DLog(...) NSLog(__VA_ARGS__) 
#else 
# define DLog(...) /* */ 
#endif 

和ViewController.m文件,

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    DLog(@"printing from DLog"); 

    DLog(@"printing again from DLog"); 

// Do any additional setup after loading the view, typically from a nib. 
} 

這將打印句子控制檯。 如果您發現有困難,請告知我。

+2

這不會覆蓋任何東西,這將創建一個新的日誌記錄系統,最後使用NSLog: – Ondrej 2015-06-16 16:54:09