Xcode8控制台乱码的另一种解决方式

作者: 强哥来简述 | 来源:发表于2016-10-20 01:20 被阅读1096次

    之前解决控制台log输出的方式

    Xcode8里边 Edit Scheme-> Run -> Arguments, 在Environment Variables里边添加 OS_ACTIVITY_MODE = Disable 环境变量 ,这个相信大家都会.

    707724-e81adf182229475f.png

    使用改变Xcode系统模板的方式

    先介绍几个c函数

    /**
     *getenv(取得环境变量内容)
     *定义函数 char * getenv(const char *name);
     *函数说明 getenv()用来取得参数name环境变量的内容。
     *参数说明
     *name为环境变量的名称,如果该变量存在则会返回指向该内容的指针。
     *环境变量的格式为name=value。
     *返回值:执行成功则返回指向该内容的指针,找不到符合的环境变量名称则返回NULL。
     */
    - (void)getenv_test:(char *)env_name
    {
        if(getenv(env_name))
        {
            printf("%s's value = %s",env_name,getenv(env_name));
        }
    }
    
    /**
     *putenv(改变或增加环境变量)
     *定义函数 int putenv(const char * string);
     *函数说明:putenv()用来改变或增加环境变量的内容。
     *参数
     *string的格式为name = value,
     *如果该环境变量原先存在,则变量内 容会依参数string改变,否则此参数内容会成为新的环境变量。
     *返回值:执行成功则返回0,有错误发生则返回-1。
     */
    - (void)putenv_test
    {
        char *env_name = "test_two";
        if(putenv(env_name) == 0)
        {
            printf("%s = %d",env_name,putenv("test_two = two"));
        }
        
    }
    
    /**
     *unsetenv(移除环境变量)
     *定义函数 unsetenv(const char *string);
     *函数说明:unsetenv()用来改变或增加环境变量的内容。
     *参数
     *string为环境变量的名称,
     *如果该环境变量原先存在,则移除该环境变量。
     *返回值:执行成功则返回0,有错误发生则返回-1。
     */
    - (void)unsetenv_test
    {
        char *env_name = "test_one";
        if(unsetenv(env_name) == 0)
        {
            printf("%s is unseted = %s",env_name,unsetenv(env_name) == 0 ? "yes" : "no");
        }
    }
    /**
    setenv(改变或增加环境变量)
     *定义函数 int setenv(const char *name,const char * value,int overwrite);
     *函数说明 setenv()用来改变或增加环境变量的内容。
     *参数 name为环境变量名称字符串。
     *参数 value则为变量内容。
     *参数 overwrite用来决定是否要改变已存在的环境变量。
      如果overwrite不为0,则改变环境变量原有内容,原有内容会被改为参数value所指的变量内容。
      如果overwrite为0,且该环境变量已有内容,则参数value会被忽略。
     *返回值 执行成功则返回0,有错误发生时返回-1
    */
    - (void)setenv_test
    {
        char *env_name = "test_one";
        char *env_value = "ooops";
        if(setenv(env_name,env_value,1) == 0)
        {
            printf("%s is seted = %s",env_name,setenv(env_name,env_value,1) == 0 ? "success" : "failed");
        }
    }
    

    我们要修改的模板如下的路径中

    /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/
    Library/Xcode/Templates/Project\ Templates/iOS/Application/Cocoa\ Touch\ Application\ Base.xctemplate
    
    Snip20161020_1.png

    打开文件,在文件中搜索如下代码

    <key>main.m:main:UIApplicationMain</key>
                            <string>@autoreleasepool {
        return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
    }
    </string>
    

    将其改为

    <key>main.m:main:UIApplicationMain</key>
                            <string>@autoreleasepool {
        /*
         * 此行代码是增加的代码
         */
        setenv("OS_ACTIVITY_MODE", "DISABLE", 1);
        return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
    }
    

    其目的是为了,在创建的Xcode项目的入口文件中增加添加环境变量的操作

    效果如下

    //
    //  main.m
    //  environment_variable
    //
    //  Created by 张强 on 16/10/20.
    //  Copyright © 2016年 张强. All rights reserved.
    //
    
    #import <UIKit/UIKit.h>
    #import "AppDelegate.h"
    
    int main(int argc, char * argv[]) 
    {
        @autoreleasepool 
    {
            setenv("OS_ACTIVITY_MODE", "disable", 1);
            return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
        }
    }
    

    至此解决Xcode8创建新项目,控制台会出现奇葩log的小缺陷!

    相关文章

      网友评论

      • 7ac503ddb843:若是Swift的项目呢,貌似没有main.m
      • 多鱼影视界:/应用程序/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/
        Library/Xcode/Templates/Project\ Templates/iOS/Application/Cocoa\ Touch\ Application\ Base.xctemplate 真的是这个路径么
        多鱼影视界:@强哥来简述 哈哈 厉害了哥
        强哥来简述:@WammysHouse Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/
        Library/Xcode/Templates/Project 后面的路径对着找,跳转文件夹是跳转不进去的
      • Cyandev:这怎么能叫乱码呢。。。。
      • c57dddf3b833:若是Swift的项目呢,貌似没有main.m
        chernyog:Swift项目里,可以自己创建一个main.swift文件,然后注释掉APPDelegate类的申明上方有个@UIApplicationMain的注解。
      • 卟师:我能转载分享吗?我会标注上作者和出处的
        强哥来简述:@卟师 可以的
      • 朋友有朋:谢谢,学到了东西
      • 钟环:强哥给力,秒杀xcode8的蛋疼。非常实用。

      本文标题:Xcode8控制台乱码的另一种解决方式

      本文链接:https://www.haomeiwen.com/subject/fthfuttx.html