精华内容
参与话题
问答
  • extension(类扩展) 1、进行一个类扩展

    extension(类扩展)

    这里写图片描述

    简单来说,extension在.m文件中添加,所以其权限为private,所以只能拿到源码的类添加extension。另外extension是编译时决议,和interface和implement里的代码融合在一块了一般。


    category(类别)

    category能在不继承类的情况下给类动态添加方法。

    1、创建category

    这里写图片描述

    关于@dynamic的特性及用法可参考:
    https://blog.csdn.net/qq_28446287/article/details/79094491


    2、category的优缺点

    • 可以将类的实现代码分散到多个不同的文件或框架中
      这里写图片描述

    • 创建对私有方法的前向引用
      OC语法中,你不能对一个类的方法定义为private,只有+、-,对实例变量可以private、public。
      具体可参考此文档http://www.cnblogs.com/stevenwuzheng/p/5457487.html

    • 向对象添加非正式协议
      对NSObject进行一个类别叫做非正式协议,可以只实现想要的方法


    3、category在runtime中的源码

    typedef struct objc_category *Category;
    struct objc_category 
    {
        //类别的名字
        char * _Nonnull category_name                            OBJC2_UNAVAILABLE;
        //该类的名字
        char * _Nonnull class_name                               OBJC2_UNAVAILABLE;
        //实例方法列表
        struct objc_method_list * _Nullable instance_methods     OBJC2_UNAVAILABLE;
        //类方法列表
        struct objc_method_list * _Nullable class_methods        OBJC2_UNAVAILABLE;
        //协议列表
        struct objc_protocol_list * _Nullable protocols          OBJC2_UNAVAILABLE;
    }                                                            OBJC2_UNAVAILABLE;

    明显看出,Category没有容纳变量的地方。


    4、category的原理

    objective-c的运行依赖runtime,runtime依赖于dyld动态加载,查看objc-os.mm文件发现其调用栈如下:

    void _objc_init(void)
    {
        static bool initialized = false;
        if (initialized) return;
        initialized = true;
    
        // fixme defer initialization until an objc-using image is found?
        environ_init();
        tls_init();
        static_init();
        lock_init();
        exception_init();
    
        // Register for unmap first, in case some +load unmaps something
        _dyld_register_func_for_remove_image(&unmap_image);
        dyld_register_image_state_change_handler(dyld_image_state_bound,
                                                 1/*batch*/, &map_2_images);
        dyld_register_image_state_change_handler(dyld_image_state_dependents_initialized, 0/*not batch*/, &load_images);
    }
    

    category被附加到类上是在map_images的时候发生的。在new-ABI的标准下,_objc_init函数里调用的map_iamges最终会调用objc-runtime-new.mm中的_read_images函数。_read_images中部分代码:

     // Discover categories. 
        for (EACH_HEADER) {
            category_t **catlist = 
                _getObjc2CategoryList(hi, &count);
            for (i = 0; i < count; i++) {
                category_t *cat = catlist[i];
                Class cls = remapClass(cat->cls);
    
                if (!cls) {
                    // Category's target class is missing (probably weak-linked).
                    // Disavow any knowledge of this category.
                    catlist[i] = nil;
                    if (PrintConnecting) {
                        _objc_inform("CLASS: IGNORING category \?\?\?(%s) %p with "
                                     "missing weak-linked target class", 
                                     cat->name, cat);
                    }
                    continue;
                }
    
                // Process this category. 
                // First, register the category with its target class. 
                // Then, rebuild the class's method lists (etc) if 
                // the class is realized. 
                bool classExists = NO;
                if (cat->instanceMethods ||  cat->protocols  
                    ||  cat->instanceProperties) 
                {
                    addUnattachedCategoryForClass(cat, cls, hi);
                    if (cls->isRealized()) {
                        remethodizeClass(cls);
                        classExists = YES;
                    }
                    if (PrintConnecting) {
                        _objc_inform("CLASS: found category -%s(%s) %s", 
                                     cls->nameForLogging(), cat->name, 
                                     classExists ? "on existing class" : "");
                    }
                }
    
                if (cat->classMethods  ||  cat->protocols  
                    /* ||  cat->classProperties */) 
                {
                    addUnattachedCategoryForClass(cat, cls->ISA(), hi);
                    if (cls->ISA()->isRealized()) {
                        remethodizeClass(cls->ISA());
                    }
                    if (PrintConnecting) {
                        _objc_inform("CLASS: found category +%s(%s)", 
                                     cls->nameForLogging(), cat->name);
                    }
                }
            }
        }
    
        ts.log("IMAGE TIMES: discover categories");

    从代码可以看出:

    将category和它的主类(或元类)注册到哈希表中.
    如果主类(或元类)已经实现,那么重建它的方列表。

    category中的实例方法和属性被整合到主类中,而类方法被整合到元类中。而协议被同时整合到了主类和元类中。

    /***********************************************************************
    * remethodizeClass
    * Attach outstanding categories to an existing class.
    * Fixes up cls's method list, protocol list, and property list.
    * Updates method caches for cls and its subclasses.
    * Locking: runtimeLock must be held by the caller
    **********************************************************************/
    static void remethodizeClass(Class cls)
    {
        category_list *cats;
        bool isMeta;
    
        runtimeLock.assertWriting();
    
        isMeta = cls->isMetaClass();
    
        // Re-methodizing: check for more categories
        if ((cats = unattachedCategoriesForClass(cls, false/*not realizing*/))) {
            if (PrintConnecting) {
                _objc_inform("CLASS: attaching categories to class '%s' %s", 
                             cls->nameForLogging(), isMeta ? "(meta)" : "");
            }
    
            attachCategories(cls, cats, true /*flush caches*/);        
            free(cats);
        }
    }

    如注释所说,此函数将未处理的category整合到主类(或元类),整合cls的方法、协议、属性列表,更新cls及其子类的方法缓存。

    查看其中的attachCategories函数:

    // Attach method lists and properties and protocols from categories to a class.
    // Assumes the categories in cats are all loaded and sorted by load order, 
    // oldest categories first.
    static void 
    attachCategories(Class cls, category_list *cats, bool flush_caches)
    {
        if (!cats) return;
        if (PrintReplacedMethods) printReplacements(cls, cats);
    
        bool isMeta = cls->isMetaClass();
    
        // fixme rearrange to remove these intermediate allocations
        method_list_t **mlists = (method_list_t **)
            malloc(cats->count * sizeof(*mlists));
        property_list_t **proplists = (property_list_t **)
            malloc(cats->count * sizeof(*proplists));
        protocol_list_t **protolists = (protocol_list_t **)
            malloc(cats->count * sizeof(*protolists));
    
        // Count backwards through cats to get newest categories first
        int mcount = 0;
        int propcount = 0;
        int protocount = 0;
        int i = cats->count;
        bool fromBundle = NO;
        while (i--) {
            auto& entry = cats->list[i];
    
            method_list_t *mlist = entry.cat->methodsForMeta(isMeta);
            if (mlist) {
                mlists[mcount++] = mlist;
                fromBundle |= entry.hi->isBundle();
            }
    
            property_list_t *proplist = entry.cat->propertiesForMeta(isMeta);
            if (proplist) {
                proplists[propcount++] = proplist;
            }
    
            protocol_list_t *protolist = entry.cat->protocols;
            if (protolist) {
                protolists[protocount++] = protolist;
            }
        }
    
        auto rw = cls->data();
    
        prepareMethodLists(cls, mlists, mcount, NO, fromBundle);
        rw->methods.attachLists(mlists, mcount);
        free(mlists);
        if (flush_caches  &&  mcount > 0) flushCaches(cls);
    
        rw->properties.attachLists(proplists, propcount);
        free(proplists);
    
        rw->protocols.attachLists(protolists, protocount);
        free(protolists);
    }

    通过while循环,遍历所有的category,得每个category的方法列表mlist、proplist和protolist并存入主类(或元类)的mlists、proplists和protolists中。从而更新类的数据字段data()中mlist、proplist和protolist的值。

    category没有替换掉原来类的方法,也就是说如果category和原来类有method1,那么在将category整合到原来类之后,类的method_list会有两个method1

    category中的method1会被放在类的method_list前面,而原来类的method1被放 到了method_list后面,在调用时候会先调用method_list前面的,所以看起来是将原来类的method1覆盖了,实际上并不是那么回事。


    5、category的两个面试题

    3.1 一个类和它的category同时拥有一个方法,在调用时候调用哪一个?答案参考“2、category的原理”

    3.2 一个类有多个category并都拥有同一个方法,在调用时候调用哪一个?答案参考“2、category的原理”

    举个例子:

    //#import "type.m"
    - (void)test
    {
        NSLog(@"type class!!");
    }
    
    //#import "type+xxxx.m"
    - (void)test
    {
        NSLog(@"category xxxx");
    }
    
    //#import "type+xxxx1.m"
    - (void)test
    {
        NSLog(@"category xxxx1");
    }
    
    //#import "type+xxxx2.m"
    - (void)test
    {
        NSLog(@"category xxxx2");
    }

    这里写图片描述
    这里写图片描述
    这里写图片描述

    可以知道,输出的结果跟compile source文件中的category的.m文件放置顺序有关。且放最底部的时候输出(主类.m文件的放置不影响,理由参考”2、category的原理”)


    6、category动态添加变量

    @interface type (xxxx)
    
    @property (nonatomic, assign)  NSInteger number;
    
    @end
    
    
    static void *numberKey = &numberKey;
    
    @implementation type (xxxx)
    
    - (void)setNumber:(NSInteger)number
    {
        objc_setAssociatedObject(self, &numberKey, [NSString stringWithFormat:@"%ld",number], OBJC_ASSOCIATION_ASSIGN);
    
    }
    
    - (NSInteger)number
    {
        return [objc_getAssociatedObject(self, &numberKey) integerValue];
    }
    
    @end
    

    objc_setAssociatedObject和objc_getAssociatedObject的描述可参考:https://www.cnblogs.com/liuting-1204/p/6526342.html

    展开全文
  • extension 生成的对象

    2019-12-27 16:56:49
    版本 # cat /etc/centos-release CentOS Linux release 7.4.1708 (Core) # # # su - postgres $ $ $ psql psql (10.10) Type "help" for help. postgres=# select version(); ...

    版本

    # cat /etc/centos-release
    CentOS Linux release 7.4.1708 (Core) 
    # 
    # 
    # su - postgres
    $ 
    $ 
    $ psql
    psql (10.10)
    Type "help" for help.
    
    postgres=# select version();
                                                     version                                                  
    ----------------------------------------------------------------------------------------------------------
     PostgreSQL 10.10 on x86_64-pc-linux-gnu, compiled by gcc (GCC) 4.8.5 20150623 (Red Hat 4.8.5-36), 64-bit
    (1 row)
    
    postgres=# 
    
    

    extension

    生成 pg_pathman extension

    postgres=# create extension pg_pathman;
    
    postgres=# \dx
                                          List of installed extensions
        Name     | Version |   Schema   |                            Description                            
    -------------+---------+------------+-------------------------------------------------------------------
     pg_pathman  | 1.5     | public     | Partitioning tool for PostgreSQL
     plpgsql     | 1.0     | pg_catalog | PL/pgSQL procedural language
    (2 rows)
    
    

    查看 extension 生成对象

    postgres=# \dx+ pg_pathman
                                      Objects in extension "pg_pathman"
                                             Object description                                          
    -----------------------------------------------------------------------------------------------------
     event trigger pathman_ddl_trigger
     function add_range_partition(regclass,anyelement,anyelement,text,text)
     function add_to_pathman_config(regclass,text)
     function add_to_pathman_config(regclass,text,text)
     function alter_partition(regclass,text,regnamespace,text)
     function append_partition_internal(regclass,regtype,text,anyarray,text,text)
     function append_range_partition(regclass,text,text)
     function attach_range_partition(regclass,regclass,anyelement,anyelement)
     function build_check_constraint_name(regclass)
     function build_hash_condition(regtype,text,integer,integer)
     function build_range_condition(regclass,text,anyelement,anyelement)
     function build_sequence_name(regclass)
     function check_boundaries(regclass,text,anyelement,anyelement)
     function check_range_available(regclass,anyelement,anyelement)
     function check_security_policy(regclass)
     function copy_foreign_keys(regclass,regclass)
     function create_hash_partitions_internal(regclass,text,integer,text[],text[])
     function create_hash_partitions(regclass,text,integer,boolean,text[],text[])
     function create_naming_sequence(regclass)
     function create_range_partitions_internal(regclass,anyarray,text[],text[])
     function create_range_partitions(regclass,text,anyarray,text[],text[],boolean)
     function create_range_partitions(regclass,text,anyelement,anyelement,integer,boolean)
     function create_range_partitions(regclass,text,anyelement,interval,integer,boolean)
     function create_single_range_partition(regclass,anyelement,anyelement,text,text)
     function debug_capture()
     function detach_range_partition(regclass)
     function disable_pathman_for(regclass)
     function drop_naming_sequence(regclass)
     function drop_partitions(regclass,boolean)
     function drop_range_partition_expand_next(regclass)
     function drop_range_partition(regclass,boolean)
     function generate_range_bounds(anyelement,anyelement,integer)
     function generate_range_bounds(anyelement,interval,integer)
     function get_base_type(regtype)
     function get_hash_part_idx(integer,integer)
     function get_number_of_partitions(regclass)
     function get_parent_of_partition(regclass)
     function get_partition_cooked_key(regclass)
     function get_partition_key(regclass)
     function get_partition_key_type(regclass)
     function get_partition_type(regclass)
     function get_part_range(regclass,anyelement)
     function get_part_range(regclass,integer,anyelement)
     function get_plain_schema_and_relname(regclass)
     function get_tablespace(regclass)
     function invoke_on_partition_created_callback(regclass,regclass,regprocedure)
     function invoke_on_partition_created_callback(regclass,regclass,regprocedure,anyelement,anyelement)
     function is_date_type(regtype)
     function is_operator_supported(regtype,text)
     function is_tuple_convertible(regclass,regclass)
     function merge_range_partitions(regclass[])
     function _partition_data_concurrent(regclass,anyelement,anyelement,integer)
     function partition_data(regclass)
     function partition_table_concurrently(regclass,integer,double precision)
     function pathman_config_params_trigger_func()
     function pathman_ddl_trigger_func()
     function pathman_set_param(regclass,text,anyelement)
     function pathman_version()
     function prepare_for_partitioning(regclass,text,boolean)
     function prepend_partition_internal(regclass,regtype,text,anyarray,text,text)
     function prepend_range_partition(regclass,text,text)
     function prevent_data_modification(regclass)
     function prevent_part_modification(regclass)
     function replace_hash_partition(regclass,regclass,boolean)
     function set_auto(regclass,boolean)
     function set_enable_parent(regclass,boolean)
     function set_init_callback(regclass,regprocedure)
     function set_interval(regclass,anyelement)
     function set_spawn_using_bgw(regclass,boolean)
     function show_cache_stats()
     function show_concurrent_part_tasks()
     function show_partition_list()
     function split_range_partition(regclass,anyelement,text,text)
     function stop_concurrent_part_task(regclass)
     function validate_expression(regclass,text)
     function validate_interval_value(regclass,text,integer,text)
     function validate_part_callback(regprocedure,boolean)
     function validate_relname(regclass)
     table pathman_config
     table pathman_config_params
     view pathman_cache_stats
     view pathman_concurrent_part_tasks
     view pathman_partition_list
    (83 rows)
    
    

    开启参数 log_statement =‘all’ 后,可以从日志里抓取到对应的SQL。

    SELECT e.extname AS "Name", e.extversion AS "Version", n.nspname AS "Schema", c.description AS "Description"
    FROM pg_catalog.pg_extension e 
         LEFT JOIN pg_catalog.pg_namespace n 
    	           ON n.oid = e.extnamespace 
    	 LEFT JOIN pg_catalog.pg_description c 
    	           ON c.objoid = e.oid 
    			   AND c.classoid = 'pg_catalog.pg_extension'::pg_catalog.regclass
    ORDER BY 1;
    
    
    SELECT e.extname, e.oid
      FROM pg_catalog.pg_extension e
     WHERE e.extname OPERATOR(pg_catalog.~) '^(pg_pathman)$'
     ORDER BY 1;
    
    SELECT pg_catalog.pg_describe_object(classid, objid, 0) AS "Object description"
      FROM pg_catalog.pg_depend
     WHERE refclassid = 'pg_catalog.pg_extension'::pg_catalog.regclass 
       AND refobjid = '24619' AND deptype = 'e'
     ORDER BY 1;
    
    
    

    做些改进后,可以查看所有extension 的表、视图对象

    SELECT pe.extoid,pe.extname,
    	   pe.extnspoid,pe.extnspname,
    	   pc.oid as reloid,pc.relname,pc.relkind,
    	   pn.oid as relnspoid,pn.nspname as relnspname,
    	   pg_catalog.pg_describe_object(pd.classid, pd.objid, 0) as  objdescription,
    	   pd.classid, pd.objid
      FROM pg_catalog.pg_depend pd,
    	   (  SELECT e.oid as extoid,e.extname , 
    					   e.extversion , 
    					   n.oid as extnspoid,n.nspname as extnspname ,c.description 
    			FROM pg_catalog.pg_extension e 
    					  LEFT JOIN pg_catalog.pg_namespace n 
    								 ON n.oid = e.extnamespace 
    					  LEFT JOIN pg_catalog.pg_description c 
    								 ON c.objoid = e.oid 
    									   AND c.classoid = 'pg_catalog.pg_extension'::pg_catalog.regclass
    			ORDER BY 1 ) pe,
    		pg_catalog.pg_class pc,
    		pg_catalog.pg_namespace pn
      WHERE pd.refclassid = 'pg_catalog.pg_extension'::pg_catalog.regclass 
        AND pd.refobjid = pe.extoid
        AND pd.deptype = 'e'
        AND pd.classid = (select pc0.oid from pg_class pc0 where pc0.oid= 'pg_catalog.pg_class'::pg_catalog.regclass)
        AND pd.objid = pc.oid
        AND pc.relnamespace = pn.oid
    ORDER BY 1;
    
    

    参考:

    展开全文
  • VS2019 community版本下载Extension太慢解决方案 今天在VS2019上更新Live Share拓展时,实在是太慢了,一直卡在如下界面。不过,除了没有进度条和速度很慢,还是可以下载和更新拓展的,这应该是VS的一个bug。解决...

    VS2019 community版本下载Extension太慢解决方案

    今天在VS2019上更新Live Share拓展时,实在是太慢了,一直卡在如下界面。不过,除了没有进度条和速度很慢,还是可以下载和更新拓展的,这应该是VS的一个bug。解决方案有两种,第一种就是科学上网。第二种就是本教程。

    1.不要在拓展管理页面直接点击Update或者Download,点击右侧详细信息,会跳转的相应网页。

    2.在打开的网页点击Download,即可通过浏览器下载。

    3.浏览器下载一般也比较慢,不过好歹有进度条显示。可以查看下载内容。

    在这里插入图片描述

    4.如果想更快一点,右键链接,选择复制链接地址。

    5.打开迅雷,添加下载任务,复制粘贴的链接。

    6.迅雷下载的速度快多了,等下载完成之后双击打开下载的文件即可。

    在这里插入图片描述

    展开全文
  • Extension 扩展

    2019-10-24 09:29:07
    import UIKit class ViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() //扩展用于6个方面,添加计算属性,添加静态计算属性,定义实例方法,定义类型方法,提供新的...
    import UIKit
    
    class ViewController: UIViewController {
        
        override func viewDidLoad() {
            super.viewDidLoad()
            //扩展用于6个方面,添加计算属性,添加静态计算属性,定义实例方法,定义类型方法,提供新的构造器,定义附属脚本,定义和使用新的嵌套类型,使一个已有类型符合某个协议。理论上扩展可以写在任何的代码块存放处,但是建议最好可以写在单独的文件中,便于管理
            //添加属性和方法
            addPropertyAndMethod()
            //添加构造器
            addInitializeMethod()
        }
        
        func addPropertyAndMethod() {
            var money:Double = 100_000_000_000_000
            debugPrint("津巴布韦货币兑换成人民币:\(money.CNY)")
            debugPrint(Double.whoAmI())
        }
        
        func addInitializeMethod() {
            var somebody = NightWatcher()
            somebody.say()
            var tarly = NightWatcher(name: "Tarly")
            tarly.say()
        }
    }
    
    extension Double {
        //扩展增加了类型属性
        static var name = "扩展Double"
        static var factor:Double {
            return 12_500_000_000_000
        }
        //增加了计算方法
        var CNY:Double {
            return self / Double.factor
        }
        //扩展增加了类型方法
        static func whoAmI()->String {
            return "我是\(name)我的类型为\(self)"
        }
    }
    
    struct Sword {
        var length = 0.5
        var materials:String = "由普通钢铸而成"
    }
    
    class NightWatcher {
        var sword: Sword
        var name: String
        init(name: String, sword:Sword) {
            self.name = name
            self.sword = sword
        }
        //扩展类类型,只能增加便捷构造器,而不能增加指定构造器和析构器
        convenience init() {
            self.init(name: "守夜人", sword:Sword())
        }
    }
    
    extension Sword {
        init(brand:String) {
            if brand == "异鬼克星" {
                self.init(length: 1, materials: "由龙晶铸造而成")
            } else {
                self.init()
            }
        }
        var description:String {
            return "长\(length)米\(materials)"
        }
    }
    
    extension NightWatcher {
        //扩展类类型,只能增加便捷构造器,而不能增加指定构造器和析构器,这里如果吧convenience去掉就会报错
        convenience init(name:String) {
            if name == "Tarly" {
                self.init(name:name, sword:Sword(brand: "异鬼克星"))
            } else {
                self.init()
            }
        }
        func say() {
            debugPrint("我是\(name) 我的剑\(sword.description)")
        }
    }
    

     

    展开全文
  • 【C# / Extension】 扩展方法

    千次阅读 2018-03-27 15:03:55
    扩展方法简介 扩展方法使你能够向现有类型“添加”方法,而无需创建新的派生类型、重新编译或以其他方式修改原始类型。 扩展方法是一种特殊的静态方法,但可以像扩展类型上的实例方法一样进行调用。...
  • StringExtension帮助类

    2014-11-21 16:18:04
    StringExtension 帮助类字符串转换
  • 扩展点加载机制(ExtensionLoader)

    万次阅读 2015-04-08 21:39:32
    概述来源: Dubbo的扩展点加载从JDK标准的SPI(Service Provider Interface)扩展点发现机制加强而来。Dubbo改进了JDK标准的SPI的以下问题: + JDK标准的SPI会一次性实例化扩展点所有实现,如果有扩展实现初始化很...
  • 定义ExtensionsExtension Points是Intellij平台提供的一套供插件之间或者是插件与平台核心功能之间通信的接口。Extension points一个插件提供给其它插件扩展自己功能的入口点,通过定义接口来约定沟通的方法,...
  • gnome-shell-extension-installer, 用于搜索和安装 extensions.gnome.org的扩展的bash脚本 GNOME shell-扩展安装程序一个bash脚本,用于从 extensions.gnome.org 安装和搜索扩展。 帮助Usage: gnome-shell-extension...
  • 1.Action Extension:动作扩展,在另一个应用程序的上下文中操作或者查看内容 2.Audio Unit Extension:音频单元扩展 3.Broadcast UI Extension:广播UI 扩展 4.Broadcast Upload Extension:广播上传扩展 5.Call ...
  • get_loaded_extensions()与get_extension_funcs()

    千次阅读 2014-03-13 17:16:54
    1,array get_loaded_extensions ([ bool $zend_extensions = false ] )  get_loaded_extensions(); 返回所有编译并加载模块名  get_loaded_extensions(ture); 只返回 Zend 扩展 我的:print_r(get_...
  • 照例的背景 新开项目,用Vue CLI3创建了Vue工程...Missing file extension “vue” for “xxxx” (import/extensions) 坑啊,每次用脚手架,都会出各种问题 解决方法 很简单,把 import Test from '../../../compon...
  • Chromium扩展(Extension)加载过程分析

    万次阅读 热门讨论 2016-09-12 00:59:50
    Chromium在启动的时候,会根据当前用户的Profile创建一个Extension Service。Extension Service在创建过程中,会加载当前已经安装的所有Extension,并且将它们注册在一个Extension Registry中。以后通过这个...
  • 这里主要是对App Extension的一些介绍以及详细给大家介绍一下Share Extension,后期会添加其他的Extension介绍。 2.开始 主要对App Extension和Share Extension进行介绍。请继续往下看: 2.1: Ap
  • 将Equinox工程增加plugin.xml扩展点后MANIFEST.MF报错: Description Resource ...Plug-ins declaring extensions or extension points must set the singleton directive to true MANIFEST.MF /MyWebServi
  • NDK 开发中出现下面的错误. 说是 在类初始化非静态数据成员是C++...xyyyplayer/src/main/cpp/XYCallJava.h:16:20: warning: in-class initialization of non-static data member is a C++11 extension [-Wc++11-exte...
  • Chromium扩展(Extension)机制简要介绍和学习计划

    万次阅读 多人点赞 2016-09-05 00:58:34
    Chromium提供了一种Extension机制,用来增强浏览器功能。我们可以将Extension看作是一种运行在Chromium中的应用。这种应用的开发语言是JavaScript,并且UI通过HTML描述。通过使用Chromium提供的API,Extension可以...
  • Chromium扩展(Extension)的页面(Page)加载过程分析

    万次阅读 热门讨论 2016-09-19 01:00:29
    Chromium的Extension Page其实就是网页,因此它们的加载过程与普通网页相同。常见的Extension Page有Background Page和Popup Page。其中,Background Page在浏览器窗口初始化完成后自动加载,之后运行在后台中。...
  • warning: in-class initialization of non-static data member is a C++11 extension [-Wc++11-extensions] 起因: 项目中为了兼容老版本,需要编译 armeabi 架构的so,但是使用的NDK 的版本为20,比较高的版本,...
  • Chromium扩展(Extension)的Content Script加载过程分析

    万次阅读 热门讨论 2016-09-26 01:00:57
    Chromium的Extension由Page和Content Script组成。Page有UI和JS,它们加载在自己的Extension Process中渲染和执行。Content Script只有JS,这些JS是注入在宿主网页中执行的。Content Script可以访问宿主网页的DOM ...
  • extensions.conf介绍

    千次阅读 2011-12-23 16:26:07
    1. 整体介绍 Asterisk的拨号方案在文件extensions.conf 中定义。文件 extensions.conf 通常在/etc/asterisk/目录下。拨号方案由4 部分组成:contexts、extensions、...l Context 用来对 extension的组命名。简单说
  • Wireless Extensions for Linux

    千次阅读 2011-07-27 17:26:14
    Wireless Extensions for LinuxJean Tourrilhes23 January 97A Wireless LAN API for the Linux operating system.1 IntroductionThe purpose of this
  • iOS中 category 和extension的区别

    千次阅读 2015-02-04 22:37:47
    Category和Extension这两个概念,即便对于Java程序员,可能也会感到陌生。这是Objective C为程序员提供的两个强大的动态机制——简单地说,它们允许程序员为已有的对象添加新的方法,即便是在没有该对象的源代码的...
  • asterisk-1.4.31----extensions.conf解读

    千次阅读 2016-11-25 18:22:43
    extensions.conf - the Asterisk dial plan ; ; Static extension configuration file, used by ; the pbx_config module. This is where you configure all your  ; inbound and outbound calls in Asterisk.
  • 周一到周五,每天一篇,北京时间早上7点准时更新~ All of the examples shown in this book so far have relied on the core functionality of OpenGL(到目前为止的案例都是基于OpenGL的核心标准的)....
  • iOS8扩展插件Extension的开发

    千次阅读 2015-08-13 14:48:26
    说到开放,当然要数应用扩展(App Extension)了。顾名思义,应用扩展允许开发者扩展应用的自定义功能和内容,能够让用户在使用其他应用程序时使用该项功能,从而实现各个应用程序间的功能和资源共享。可以将扩展...
  • vscode extension插件开发

    千次阅读 2018-11-04 07:20:44
    最近公司要使用vscode作为开发工具,需要对vscode做一些定制功能,比如snippet...上面是vscode官方提供的extension开发帮助,按照上面的步骤基本上可以做简单的demo事例 如下主要介绍下自己在开发中做的几个简单功能...
  • 前两天看到这篇介绍gnome shell extensions 开发的文章,来自blog.fpmurphy.com 很不错,特转来留着。...The new GNOME Shell in GNOME 3 includes support for GNOME Shell extensions. What, you may a...
  • 前言Xcode是一个每天都有成千上万开发者使用的IDE( 集成开发环境),它是一个非棒棒的工具,但是有时候为了提高开发效率你可能想自定义一些它的特性和行为。在Xcode 7的时候,开发者可以在Xccode运行的时候通过注入...
  • VS Code Extensions

    2017-09-04 03:14:50
    常用 VS Code 扩展。Angular 2 dependency graph、Angular Essentials,Bueatify CSS/SASS/SCSS/LESS、Bookmarks、C#、C# XML Documentation Comments、Can I Use、Do i use、Code Outline、Code Runner、Code ...

空空如也

1 2 3 4 5 ... 20
收藏数 503,394
精华内容 201,357
关键字:

extension