精华内容
下载资源
问答
  • 初始化脚本 Gradle提供了一种强大的机制,可以让你基于当前的环境自定义构建。这种机制还支持希望与Gradle集成的工具。 60.1. 基本用法 初始化脚本 (也称为init scripts和Gradle的其他脚本类似。然而,这些脚本是...
    其他章节的翻译请参见:
    http://blog.csdn.net/column/details/gradle-translation.html
    翻译项目请关注Github上的地址:
    https://github.com/msdx/gradledoc
    本文翻译所在分支:
    https://github.com/msdx/gradledoc/tree/1.12。
    直接浏览双语版的文档请访问:
    http://gradledoc.qiniudn.com/1.12/userguide/userguide.html。
    另外,Android 手机用户可通过我写的一个程序浏览文档,带缓存功能的,目前0.6开发中版本兼容 Android 2.3以上系统,项目地址如下:
    https://github.com/msdx/gradle-doc-apk
    翻译不易,转载请注明本文在CSDN博客上的出处:

    http://blog.csdn.net/maosidiaoxian/article/details/70941864

    关于我对Gradle的翻译,以Github上的项目及http://gradledoc.qiniudn.com 上的文档为准。如发现翻译有误的地方,将首先在以上两个地方更新。因时间精力问题,博客中发表的译文基本不会同步修改。

    另外,目前Gradle1.12版本的文档已经翻译完并进入校稿阶段,校稿的方式为到该项目https://github.com/msdx/gradledoc 提交issue或是pull request。校稿的结果不只是在此版本更新,也会用于改善Gradle下一版本(2.0)文档的翻译。


    第六十章. 初始化脚本

    Gradle提供了一种强大的机制,可以让你基于当前的环境自定义构建。这种机制还支持希望与Gradle集成的工具。

    60.1. 基本用法

    初始化脚本 (也称为init scripts和Gradle的其他脚本类似。然而,这些脚本是在构建之前就运行的。下面是几种可能的用法:

    • 设置一些企业范围的配置,比如在何处查找自定义插件。

    • 设置基于当前环境的属性,比如开发人员的机器与持续集成服务器的属性。

    • 提供构建所需要的有关用户的个人信息,比如仓库或数据库身份验证凭据。

    • 定义机器的一些特定信息,比如JDK的安装位置。

    • 注册构建监听。这对一些希望能够监听Gradle事件的外部工具会很有用。

    • 注册构建logger。你可能希望自定义Gradle对生成的事件的日志打印。

    init 脚本的一个主要限制是,它们不能访问buildSrc 项目里的类(该功能的详细信息可参见 第 59.3节,“的buildSrc 项目中的构建源代码”)。

    60.2. 使用 init 脚本

    有几种方法来使用 init 脚本︰

    • 在命令行上指定一个文件。该命令行选项是-I--init-script ,后面跟上该脚本的路径。这个命令行选项可以出现多次,每次在其后面添加另一个init 脚本.

    • 把一个init.gradle文件放到 USER_HOME/.gradle/ 目录。

    • Put a file that ends with .gradle in the USER_HOME/.gradle/init.d/ directory.

    • 把一个文件名以.gradle结尾的文件放到Gradle 分发包GRADLE_HOME/init.d/ 目录内。这能够使你可以打包一个包含某些自定义构建逻辑和插件的Gradle自定义分发包。你可以结合它与Gradle wrapper作为一种方式,以使自定义逻辑可用于你的企业中的所有构建。

    如果Gradle找到了多个init脚本,那么它们将会全部按照以上的顺序执行。而给定目录的脚本,会按照字母顺序执行。这能够使得,比如,一个工具可以在命令行上指定一个init 脚本,并且用户可以放一个初始化脚本到他们的用户目录下用于定义环境,而当Gradle执行的时候,这两个脚本都会运行。

    60.3. 写一个 init 脚本

    与Gradle构建脚本类似,init 脚本也是一个groovy 脚本。每一个init 脚本都有一个 Gradle 实例与其关联。在这个init 脚本中调用的任何属性引用以及方法,都会委托给这个 Gradle 实例。

    每一个初始化脚本也实现了 Script 接口。

    60.3.1. 从一个初始化脚本中配置项目

    你可以使用一个init 脚本来在构建中配置项目。这与在多项目构建中配置项目的方式类似。下面的例子展示了如何在项目被评估 之前 从一个init 脚本中执行另外的配置。该示例使用此功能来配置额外的仓库,以让它仅用于特定的环境。

    示例 60.1. 使用 init 脚本在项目评估之前执行额外的配置

    build.gradle

    repositories {
        mavenCentral()
    }
    
    task showRepos << {
        println "All repos:"
        println repositories.collect { it.name }
    }

    init.gradle

    allprojects {
        repositories {
            mavenLocal()
        }
    }

    gradle --init-script init.gradle -q showRepos的输出结果

    > gradle --init-script init.gradle -q showRepos
    All repos:
    [MavenLocal, MavenRepo]

    60.4. init 脚本的外部依赖

    在 第 59.5节,“构建脚本的外部依赖” 中已经解释了,如何向一个构建脚本添加外部依赖。init 脚本同样也可以定义外部依赖。你可以通过使用<c0>initscript()</c0>方法,传入一个定义init 脚本的classpath的闭包。

    示例 60.2. 声明构建脚本的外部依赖

    init.gradle

    initscript {
        repositories {
            mavenCentral()
        }
        dependencies {
            classpath group: 'org.apache.commons', name: 'commons-math', version: '2.0'
        }
    }

    这个传给initscript() 方法的闭包配置了一个ScriptHandler 实例。你可以通过添加依赖到classpath 配置来定义init 脚本的classpath。这和你定义Java编译classpath是同样的。你可以使用在 第50.4节,“如何定义你的依赖”描述的除了项目依赖之外的任何依赖类型。

    声明了init 脚本的classpath之后,你可以使用init 脚本中的类,就像classpath上的任何其他类一样。下面的示例将添加到前面的示例中,并使用init 脚本classpath中的类。

    示例 60.3. 具有外部依赖的init 脚本

    init.gradle

    import org.apache.commons.math.fraction.Fraction
    
    initscript {
        repositories {
            mavenCentral()
        }
        dependencies {
            classpath group: 'org.apache.commons', name: 'commons-math', version: '2.0'
        }
    }
    
    println Fraction.ONE_FIFTH.multiply(2)

    Output of gradle --init-script init.gradle -q doNothing

    > gradle --init-script init.gradle -q doNothing
    2 / 5

    60.5. Init 脚本插件

    与Gradle构建脚本类似,插件也可以应用在 init 脚本上。

    示例 60.4. 在 init 脚本中使用插件

    init.gradle

    apply plugin:EnterpriseRepositoryPlugin
    
    class EnterpriseRepositoryPlugin implements Plugin<Gradle> {
    
        private static String ENTERPRISE_REPOSITORY_URL = "http://repo.gradle.org/gradle/repo"
    
        void apply(Gradle gradle) {
            // ONLY USE ENTERPRISE REPO FOR DEPENDENCIES
            gradle.allprojects{ project ->
                project.repositories {
    
                    //remove all repositories not pointing to the enterprise repository url
                    all { ArtifactRepository repo ->
                        if (!(repo instanceof MavenArtifactRepository) || repo.url.toString() != ENTERPRISE_REPOSITORY_URL) {
                            project.logger.lifecycle "Repository ${repo.url} removed. Only $ENTERPRISE_REPOSITORY_URL is allowed"
                            remove repo
                        }
                    }
    
                    // add the enterprise repository
                    maven {
                        name "STANDARD_ENTERPRISE_REPO"
                        url ENTERPRISE_REPOSITORY_URL
                    }
                }
            }
        }
    }

    build.gradle

    repositories{
        mavenCentral()
    }
    
     task showRepositories << {
        repositories.each{
            println "repository: ${it.name} ('${it.url}')"
        }
    }

    gradle -I init.gradle showRepositories 的输出结果

    > gradle -q -I init.gradle showRepositories
    repository: STANDARD_ENTERPRISE_REPO ('http://repo.gradle.org/gradle/repo')

    这个在示例的init 脚本中的插件,确保了当执行构建的时候只使用一个指定的仓库。

    当把插件应用在 init 脚本中时,Gradle 会实例化该插件,并调用这个插件的实例的Plugin.apply()方法。然后 gradle 对象会被作为参数传入,用于配置构建的所有方面。当然,所应用的插件也可以作为第 60.4节,“init 脚本外部依赖”中所述的外部依赖被解析。



    展开全文
  • Django 文档协作翻译小组人手紧缺,有兴趣的朋友可以加入我们,完全公益性质。 交流群:467338606 网站:http://python.usyiyi.cn/django/index.html 为模型提供初始数据当你首次建立一个应用的时候,为你的...

    Django 文档协作翻译小组人手紧缺,有兴趣的朋友可以加入我们,完全公益性质。

    交流群:467338606

    网站:http://python.usyiyi.cn/django/index.html

    为模型提供初始数据

    当你首次建立一个应用的时候,为你的数据库预先安装一些硬编码的数据,是很有用处的。 有几种方法可以让Django自动创建这些数据:你可以通过fixtures提供初始数据,或者提供一个包含初始数据的sql文件。

    通常来讲,使用fixtrue更加简洁,因为它是数据库无关的,而使用sql初始化更加灵活。

    提供初始数据的fixtures

    fixture是数据的集合,让Django了解如何导入到数据库中。创建fixture的最直接的方式,是使用manage.py dumpdata命令,如果数据库中已经有了一些数据。或者你可以手写fixtures。fixtures支持JSON、XML或者YAML(需要安装PyYAML)文档。序列化文档中详细阐述了每一种所支持的序列化格式。

    下面这个例子展示了一个简单的Person 模型的fixtrue,看起来很像JSON:

    [
      {
        "model": "myapp.person",
        "pk": 1,
        "fields": {
          "first_name": "John",
          "last_name": "Lennon"
        }
      },
      {
        "model": "myapp.person",
        "pk": 2,
        "fields": {
          "first_name": "Paul",
          "last_name": "McCartney"
        }
      }
    ]

    下面是它的YAML格式:

    - model: myapp.person
      pk: 1
      fields:
        first_name: John
        last_name: Lennon
    - model: myapp.person
      pk: 2
      fields:
        first_name: Paul
        last_name: McCartney

    你可以把这些数据储存在你应用的fixtures目录中。

    加载数据很简单:只要调用manage.py loaddata <fixturename>就好了,其中<fixturename>是你所创建的fixture文件的名字。每次你运行loaddata的时候,数据都会从fixture读出,并且重复加载进数据库。注意这意味着,如果你修改了fixtrue创建的某一行,然后再次运行了 loaddata,你的修改将会被抹掉。

    自动加载初始数据的fixtures

    1.7中废除:
    
    如果一个应用使用了迁移,将不会自动加载fixtures。由于Django 1.9中,迁移将会是必要的,这一行为经权衡之后被废除。 如果你想在一个应用中加载初始数据,考虑在数据迁移中加载它们。

    如果你创建了一个命名为 initial_data.[xml/yaml/json]的fixtrue,在你每次运行migrate命令时,fixtrue都会被加载。这非常方面,但是要注意:记住数据在你每次运行migrate命令后都会被刷新。So don’t use initial_data for data you’ll want to edit.

    Django在哪里寻找fixture文件

    通常,Django 在每个应用的fixtures目录中寻找fixture文件。你可以设置FIXTURE_DIRS选项为一个额外目录的列表,Django会从里面寻找。

    运行manage.py loaddata命令的时候,你也可以指定一个fixture文件的目录,它会覆盖默认设置中的目录。

    另见

    fixtrues也被用于测试框架来搭建一致性的测试环境。

    提供初始SQL数据

    1.7中废除:
    
    如果一个应用使用迁移,初始SQL数据将不会加载(包括后端特定的SQL数据)。由于Django 1.9中,迁移将会是必须的,这一行为经权衡后被废除。如果你想在应用中使用初始SQL数据,考虑在数据迁移中使用它们。

    Django为数据库无关的SQL提供了一个钩子,当你运行migrate命令时,CREATE TABLE语句执行之后就会执行它。你可以使用这个钩子来建立默认的记录,或者创建SQL函数、视图、触发器以及其它。

    钩子十分简单:Django会在你应用的目录中寻找叫做sql/<modelname>.sql的文件,其中 <modelname>是小写的模型名称。

    所以如果在myapp应用中存在Person模型,你应该在myapp目录的文件sql/person.sql中添加数据库无关的SQL。下面的例子展示了文件可能会包含什么:

    INSERT INTO myapp_person (first_name, last_name) VALUES ('John', 'Lennon');
    INSERT INTO myapp_person (first_name, last_name) VALUES ('Paul', 'McCartney');

    每个提供的SQL文件,都应该含有用于插入数据的有效的SQL语句(例如,格式适当的INSERT语句,用分号分隔)。

    这些SQL文件可被manage.py中的 sqlcustom和sqlall命令阅读。详见manage.py文档。

    注意如果你有很多SQL数据文件,他们执行的顺序是不确定的。唯一可以确定的是,在你的自定义数据文件被执行之前,所有数据表都被创建好了。

    初始SQL数据和测试

    这一技巧不能以测试目的用于提供初始数据。Django的测试框架在每次测试后都会刷新测试数据库的内容。所以,任何使用自定义SQL钩子添加的数据都会丢失。

    如果你需要在测试用例中添加数据,你应该在测试fixture中添加它,或者在测试用例的setUp()中添加。

    数据库后端特定的SQL数据

    没有钩子提供给后端特定的SQL数据。例如,你有分别为PostgreSQL和SQLite准备的初始数据文件。对于每个应用,Django都会寻找叫做<app_label>/sql/<modelname>.<backend>.sql的文件,其中<app_label>是小写的模型名称,<modelname>是小写的模型名称,<backend>是你的设置文件中由ENGINE提供的模块名称的最后一部分(例如,如果你定义了一个数据库,ENGINE的值为django.db.backends.sqlite3,Django会寻找<app_label>/sql/<modelname>.sqlite3.sql)。

    后端特定的SQL数据会先于后端无关的SQL数据执行。例如,如果你的应用包含了sql/person.sql 和sql/person.sqlite3.sql文件,而且你已经安装了SQLite应用,Django会首先执行 sql/person.sqlite3.sql的内容,其次才是sql/person.sql。

    展开全文
  • 在分析Android系统的init程序源码时看到了这份Doc,觉得对系统的分析挺有用的,所以翻译了出来! Android初始化语言(init.*.rc、init.conf文件格式) Android初始化语言包含了四种类型的声明:Actions(行动)、...

    在分析Android系统的init程序源码时看到了这份Doc,觉得对系统的分析挺有用的,所以翻译了出来!

     

    Android初始化语言(init.*.rc、init.conf文件格式)



        Android初始化语言包含了四种类型的声明:Actions(行动)、Commands(命令)、Services(服务)和Options(选项)。

        所有这些都是以行为单位的,各种记号由空格来隔开。C语言风格的反斜杠号可用于在记号间插入空格。双引号也可用于防止字符串被空格分割成多个记号。行末的反斜杠用于折行。
        注释行以井号(#)开头(允许以空格开头)。
        Actions和Services声明一个新的分组。所有的命令或选项都属于最近申明的分组。位于第一个分组之前的命令或选项将会被忽略。
        Actions和Services有唯一的名字。如果有重名的情况,第二个申明的将会被作为错误忽略。(???我们是否应该以覆盖来代替忽略)

    Actions(行动)
    ----------
        Actions其实就是一序列的Commands(命令)。Actions都有一个trigger(触发器),它被用于决定action的执行时间。当一个符合action触发条件的事件发生时,action会被加入到执行队列的末尾,除非它已经在队列里了。
        队列中的每一个action都被依次提取出,而这个action中的每个command(命令)都将被依次执行。Init在这些命令的执行期间还控制着其他的活动(设备节点的创建和注销、属性的设置、进程的重启)。

    Actions的形式如下:


        on <trigger>
           <command>
           <command>
           <command>


    Services(服务)
    ----------
        Services(服务)是一个程序,他在初始化时启动,并在退出时重启(可选)。Services(服务)的形式如下:

     

        service <name> <pathname> [ <argument> ]*
           <option>
           <option>
           ...

     

    Options(选项)
    ----------
        Options(选项)是一个Services(服务)的修正者。他们影响Services(服务)在何时,并以何种方式运行。

            critical(关键)
                说明这是一个对于设备关键的服务。如果他四分钟内退出大于四次,系统将会重启并进入recovery(恢复)模式。

            disabled(失效)
                说明这个服务不会同与他同trigger(触发器)下的服务自动启动。他必须被明确的按名启动。

            setenv <name> <value> (设置环境变量)
                在进程启动时将环境变量<name>设置为<value>。

            socket <name> <type> <perm> [ <user> [ <group> ] ]
                创建一个Uinx域的名为/dev/socket/<name> 的套接字,并传递它的文件描述符给已启动的进程。<type> 必须是 "dgram"或"stream"。User 和 group默认为0。

            user <username>
                在启动这个服务前改变该服务的用户名。此时默认为root。(???有可能的话应该默认为nobody)。当前,如果你的进程要求Linux capabilities(能力),你无法使用这个命令。即使你是root,你也必须在程序中请求capabilities(能力)。然后降到你想要的uid。

            group <groupname> [ <groupname> ]*
                在启动这个服务前改变该服务的组名。除了(必需的)第一个组名,附加的组名通常被用于设置进程的补充组(通过setgroups())。此时默认为root。(???有可能的话应该默认为nobody)。
        
            oneshot
                服务退出时不重启。

            class <name>
                指定一个服务类。所有同一类的服务可以同时启动和停止。如果不通过class选项指定一个类,则默认为"default"类服务。

            onrestart
                当服务重启,执行一个命令(下详)。

    Triggers(触发器)
    ----------
        Triggers(触发器)是一个用于匹配特定事件类型的字符串,用于使Actions(行动)发生。
        
            boot
                这是init执行后的第一个被触发的Triggers(触发器)。(在 /init.conf (启动配置文件)被装载之后)

            <name>=<value>
                这种形式的Triggers(触发器)会在属性<name>被设置为指定的<value>时被触发。

            device-added-<path>
            device-removed-<path>
                这种形式的Triggers(触发器)会在一个设备节点文件被增删时触发。

            service-exited-<name>
                这种形式的Triggers(触发器)会在一个特定的服务退出时触发。


    Commands(命令)
    ----------    
        exec <path> [ <argument> ]*
             创建和执行一个程序(<path>)。在程序完全执行前,init将会阻塞。由于它不是内置命令,应尽量避免使用exec,它可能会引起init卡死。(??? 是否需要一个超时设置?)

        export <name> <value>
            在全局环境变量中设在环境变量 <name>为<value>。(这将会被所有在这命令之后运行的进程所继承)
           
        ifup <interface>
            启动网络接口<interface>

        import <filename>
               解析一个init配置文件,扩展当前配置。

        hostname <name>
               设置主机名。

        chmod <octal-mode> <path>
               更改文件访问权限。

        chown <owner> <group> <path>
               更改文件的所有者和组。

        class_start <serviceclass>
               启动所有指定服务类下的未运行服务。

        class_stop <serviceclass>
            停止指定服务类下的所有已运行的服务。

        domainname <name>
               设置域名。

        insmod <path>
               加载<path>中的模块。

        mkdir <path> [mode] [owner] [group]
               创建一个目录<path>,可以选择性地指定mode、owner以及group。如果没有指定,默认的权限为755,并属于root用户和root组。

        mount <type> <device> <dir> [ <mountoption> ]*
            试图在目录<dir>挂载指定的设备。<device> 可以是以 mtd@name 的形式指定一个mtd块设备。<mountoption>包括 "ro"、"rw"、"remount"、"noatime"、 ...

        setkey
               待完成......(暂时不可用)

        setprop <name> <value>
               设置系统属性 <name> 为 <value>值.

        setrlimit <resource> <cur> <max>
            设置<resource>的rlimit(资源限制)。

        start <service>
            启动指定服务(如果此服务还未运行)。

        stop <service>
            停止指定服务(如果此服务在运行中)。

        symlink <target> <path>
            创建一个指向<path>的软连接<target>。

        sysclktz <mins_west_of_gmt>
            设置系统时钟基准(0代表时钟滴答以格林威治平均时(GMT)为准)

        trigger <event>
               触发一个事件。用于将一个action与另一个 action排列。(?????)

        write <path> <string> [ <string> ]*
               打开路径为<path>的一个文件,并写入一个或多个字符串。


    Properties(属性)
    ----------
        Init更新一些系统属性以提供对正在发生的事件的监控能力:

            init.action
                   此属性值为正在被执行的action的名字,如果没有则为""。

            init.command
                   此属性值为正在被执行的command的名字,如果没有则为""。

            init.svc.<name>
                   名为<name>的service的状态("stopped"(停止), "running"(运行), "restarting"(重启))                


    init.conf实例
    -----------------

     

    # not complete -- just providing some examples of usage
    #
    on boot
       export PATH /sbin:/system/sbin:/system/bin
       export LD_LIBRARY_PATH /system/lib

       mkdir /dev
       mkdir /proc
       mkdir /sys

       mount tmpfs tmpfs /dev
       mkdir /dev/pts
       mkdir /dev/socket
       mount devpts devpts /dev/pts
       mount proc proc /proc
       mount sysfs sysfs /sys

       write /proc/cpu/alignment 4

       ifup lo

       hostname localhost
       domainname localhost

       mount yaffs2 mtd@system /system
       mount yaffs2 mtd@userdata /data

       import /system/etc/init.conf

       class_start default

    service adbd /sbin/adbd
       user adb
       group adb

    service usbd /system/bin/usbd -r
       user usbd
       group usbd
       socket usbd 666

    service zygote /system/bin/app_process -Xzygote /system/bin --zygote
       socket zygote 666

    service runtime /system/bin/runtime
       user system
       group system

    on device-added-/dev/compass
       start akmd

    on device-removed-/dev/compass
       stop akmd

    service akmd /sbin/akmd
       disabled
       user akmd
       group akmd

     

    调试记录
    ---------------
    在默认情况下,程序在被init执行时会将标准输出和标准错误都重定向到/dev/null(丢弃)。若你想要获得调试信息,你可以通过Andoird系统中的logwrapper程序执行你的程序。它会将标准输出/标准错误都重定向到Android日志系统(通过logcat访问)。

    例如:


    service akmd /system/bin/logwrapper /sbin/akmd

     

    PDF下载

    展开全文
  • *说明:翻译水平有限,希望对初学者有帮助。本人添加的部分用下划线标明。重点用橙色字体。 类 NSTimer 说明 一、概述  你可以用NSTimer类来创建定时器对象。经过一定时间启动定时器,并发送一个特定消息给目标...

    *说明:翻译水平有限,希望对初学者有帮助。本人添加的部分用下划线标明重点用橙色字体


    类 NSTimer 说明

    一、概述

            你可以用NSTimer类来创建定时器对象。经过一定时间启动定时器,并发送一个特定消息给目标对象。比如:你创建了一个定时器,用于一段时间之后,给窗口发了一条消息,告诉它更新。

            定时器跟run loops协同工作。想要高效使用NSTimer,你应该了解run loops是怎么操作的。需要特别说明的是:run loops 持有(retain)定时器。所以,你可以在定时器加入run loop后,释放它。

            定时器不是真正意义上,实时生效的机制;仅当run loop(自己已经添加进去了)正在运行,且程序设定的启动时间已经过去了,定时器才会启动。由于run loop管理着各种的输入源,所以NSTimer的精准度在50-100微秒。如果定时器启动时刻正一个很长时间的callout或者run loop处于一个不再检测这个定时的模式,它将不启动直到run loop检测到下一个启动时刻。因此,定时器真正生效时间,应该在程序设定启动时刻之后的一段时间内。

            NSTimer 是“tool-free bridge”模式,在Core Foundation中对应着CFRunLoopTimerRef。

    重复 vs 非重复定时器

            在初始化定时间的时候,你要指定这个定时器是重复的还是非重复的。顾名思义:非重复的定时器启动一次后,自动失效,从而防止再次触发定时器。与此相反,重复定时器启动一次后,又把自己放到run loop里,准备下次启动。

            重复模式的定时器总是根据,被设计好的时间来安排自己启动时间,并非实际启动时间。如果,一个定时器的启动时间是每5秒。那么定时器就在5秒后启动,即便实际的时间被延时了。如果,启动时间呗延时的足够长,达到多个启动时间(10秒,20秒等),这段时间内定时器将只启动一次;定时器被重新排布时间,等待下次启动时刻到来。

    在Run Loops里安置定时器

    一个定时器对象,一次只能被注册到一个run loop,虽然它能被添加到“multiple run loop”借助与它所在的run loop
    有三种方法创建一个定时器。
    1.使用scheduledTimerWithTimeInterval:invocation:repeats: 或者scheduledTimerWithTimeInterval:target:selector:userInfo:repeats:来创建定时器,默认被安置到当前的run loop上。
    2.使用 timerWithTimeInterval:invocation:repeats: 或者 timerWithTimeInterval:target:selector:userInfo:repeats: 来创建定时器,不会安置到run loop里(创建后,你必须手动安置到一个run loop里,通过调用NSRunLoop的函数 addTimer:forMode: )。
    3.开辟资源并初始化定时器用 initWithFireDate:interval:target:selector:userInfo:repeats:方法。(同样,你必须手动安置到一个run loop里通过调用NSRunLoop的函数 addTimer:forMode: 

       一旦定时器被安置到run loop里,定时器就开运行了,直到自己失效。非重复定时器运行后,就让自己失效。然而,对于重复模式定时器,你需要调用invalidate函数使定时器失效。调用invalidate使得定时器从当前的run loop移除。结果,你应该总是调用 invalidate 方法,来移除安装在同一个线程上的定时器。失效的定时器会立即被禁用,以便它不再影响run loop,run loop在invalidate 方法返回前或者稍晚一些,移除并释放定时器,定时器一旦失效,这个对象将不能再使用了。

    NSTimer子类注意事项

           你不应该尝试用NSTimer生成子类。


    Tasks

    --------------------------------------------------------------------------
    创建定时器:
    停止定时器
    – invalidate不可恢复
    暂停定时器

    [timersetFireDate:[NSDatedistantFuture]];

    恢复定时器

    [timersetFireDate:[NSDatedate]];

    [iNorSlidePer fire];


    其他信息

    类方法

    -------------------------------------------------------------------

    scheduledTimerWithTimeInterval:invocation:repeats:

    创建一个NSTimer对象,默认并把它安置到当前的run loop里。
    + (NSTimer *)scheduledTimerWithTimeInterval:(NSTimeInterval)seconds invocation:(NSInvocation *)invocation repeats:(BOOL)repeats
    参数:
    seconds:定时器间隔,如果seconds <= 0.0,该函数选择0.1毫秒代替。
    invocation:The invocation to use when the timer fires. The timer instructs the invocation object to retain its arguments.
    repeats:如果YES,定时器重复启动自己直到失效。如果NO,定时器启动后即失效。
    返回值:NSTimer对象。
    讨论:经过seconds秒后,定时器启动,回调invocation。

    scheduledTimerWithTimeInterval:target:selector:userInfo:repeats:

    创建一个NSTimer对象,默认并把它安置到当前的run loop里。
    + (NSTimer *)scheduledTimerWithTimeInterval:(NSTimeInterval)seconds target:(id)target selector:(SEL)aSelectoruserInfo:(id)userInfo repeats:(BOOL)repeats
    参数:
    seconds:定时器间隔,如果seconds <= 0.0,该函数选择0.1毫秒代替。
    target:定时器启动后,发送消息的对象。定时器保存target对象并释放target当自己无效。
    aSelector:定时器启动后发送消息给target,selector 的格式必须是返回void并带一个参数。定时器传递把自己当做参数传给aSelector。
    userInfo:用于定时器的use info,定时器保存这个对象,并释放它当定时器无效后。该参数可以为nil
    repeats:如果YES,定时器重复启动自己直到失效。如果NO,定时器启动后即失效。
    返回值:NSTimer对象
    讨论:seconds秒之后,定时器启动。发送一个aSelector的消息给target。

    timerWithTimeInterval:invocation:repeats:

    创建一个用invocation对象初始化的NSTimer对象,
    + (NSTimer *)timerWithTimeInterval:(NSTimeInterval)seconds invocation:(NSInvocation *)invocation repeats:(BOOL)repeats
    参数:
    seconds(同上)
    invocation(同上)
    repeats(同上)
    返回值(同上)
    讨论:你必须调用 addTimer:forMode:把定时器对象添加到一个run loop里。经过seconds后,定时器启动,回调invocation。(如果是重复模式定时器,没有必要重复添加到run loop里)

    timerWithTimeInterval:target:selector:userInfo:repeats:

    创建一个用特定对象初始化的NSTimer对象。
    + (NSTimer *)timerWithTimeInterval:(NSTimeInterval)seconds target:(id)target selector:(SEL)aSelector userInfo:(id)userInfo repeats:(BOOL)repeats
    参数:
    seconds:(同上)
    target:(同上)
    aSelector:定时器启动后发送消息给target,aSelector必须是如下函数签名
    - (void)timerFireMethod:(NSTimer*)theTimer
    定时器把自己当做参数传递给这个函数。
    userInfo: 用于定时器的use info,定时器保存这个对象,并释放它当定时器无效后。该参数可以为nil
    repeats:(同上)
    返回值:NSTimer对象
    讨论:你必须调用 addTimer:forMode:把定时器对象添加到一个run loop里。经过seconds后,定时器启动,回调invocation。(如果是重复模式定时器,没有必要重复添加到run loop里)


    方法实例

    ----------------------------------------------------------------------------------------------------------------------------------------------------
    fire
    触发定时器,发送消息给target。
    - (void)fire
    讨论
    你可以用这个方法启动一个重复模式定时器。如果该定时器是非重复模式,那么它也自动失效当fire后,及时还没到程序设定的启动时刻。

    fireDate
    返回定时器启动的日期。
    - (NSDate *)fireDate
    返回值
    定时器启动的日期,如果定时器是无效的,该方法返回定时器最后一次启动的日期。

    initWithFireDate:interval:target:selector:userInfo:repeats:

    用target和select初始化定时器。
    - (id)initWithFireDate:(NSDate *)date interval:(NSTimeInterval)seconds target:(id)target selector:(SEL)aSelectoruserInfo:(id)userInfo repeats:(BOOL)repeats
    参数:
    date
            定时器启动的日期。
    seconds:(同上)
    target:(同上)
    aSelector:定时器启动后发送消息给target,aSelector必须是如下函数签名
    - (void)timerFireMethod:(NSTimer*)theTimer
    定时器把自己当做参数传递给这个函数。
    userInfo :(同上 )
    repeats:(同上)
    返回值:如果该定时器被添加到run loop里,并且它又是一个重复模式,它将在date的时候启动,每秒钟都启动一次。
    讨论:你必须调用 addTimer:forMode:把定时器对象添加到一个run loop里。经过seconds后,定时器启动,回调invocation。(如果是重复模式定时器,没有必要重复添加到run loop里)

    invalidate

    停止定时器,并将其从run loop里移除。无法再恢复,再次使用

    - (void)invalidate
    讨论
        该方法是将定时器从run loop里移除的唯一方法。run loop在invalidate 方法返回前或者稍晚一些,移除并释放定时器。
    If it was configured with target and user info objects, the receiver releases its references to those objects as well.
    特别注意事项:

    你必须在定时器所在的线程中发送这个消息。如果从其他可能退出的线程中发送这个消息,定时器相关的输入源可能会从run loop中移除。

    isValid

    返回布尔类型,表明定时器是有效还是无效的。
    - (BOOL)isValid

    返回值:如果YES表示定时器还可以启动,如果NO说明定时器已经无效了,不能再启动了。

    setFireDate:


    重置定时器启动的日期。
    - (void)setFireDate:(NSDate *)date
    参数:
    date:定时器启动的日期。如果这个日期是过去式,那么该方法就设置当前时间作为启动日期。
    讨论
            通常,你用这个方法来调整重复模式定时器的启动时间。尽管重置定时器日期是个相对开销较大的操作,但是有些时候它很更有效。比如:你可以在将来一段时间内规律得重复一个动作很多次这种情况下使用它。调整一个定时器将比创建多个定时器对象,安置到run loop并销毁他们这些复杂操作的开销要小。
            当定时器无效时,还有非重复定时器启动后,不应该调用该方法。你可以在非重复定时器启动前调用该方法,但是你要避开该定时器所在线程中潜在的竞争条件。

    timeInterval


    返回定时器的启动时间间隔
    - (NSTimeInterval)timeInterval
    返回值:
         定时器的启动时间间隔。如果是非重复定时器,即便它设置了启动时间,但是也返回0

    userInfo

    返回定时器的userInfo对象
    - (id)userInfo
    返回值“
         定时器的userInfo对象
    讨论:
         当定时器无效后,不要调用该方法。用isValid检测定时器是否已经无效。

    (完)
    展开全文
  • JConfig帮助文档翻译初始化JConfig

    千次阅读 2004-10-03 01:45:00
    它能帮助你创建一个高质量,可扩展的java应用要使用JConfig,你必须确定JConfig能找到它运行时所需要的所有文件,并且你要适当的对JConfig进行初始化配置。如果你在安装时出现问题,请参考附带的例子和帮助文件来找到...
  • 5.3 参数初始估计理论上,估计公式可以给出似然函数局部最小值对应的参数。这样的话,我们怎么选择HMM参数的初始值使得局部最大是全局最大呢?对于上面的问题并没有直接的答案。经验表明,对pipi和AA进行随机初始化...
  • Paper:He参数初始化之《Delving Deep into Rectifiers: Surpassing Human-Level Performance on ImageNet Classification》的翻译与解读 Delving Deep into Rectifiers: Surpassing Human-Level Performance on ...
  • AT91初始化代码手册中文翻译

    千次阅读 2007-01-18 16:39:00
    然而,启动顺序要求初始化ARM处理器和严重依赖于寄存器结构的关键设备和内存映射处理机,和存储器重映射操作。由于这个原因,C启动序列必须用汇编编写。这个应用笔记描述了一个AT91的C代码启动序列示例。他是使用ARM...
  • Paper:Xavier参数初始化之《Understanding the difficulty of training deep feedforward neural networks》的翻译与解读 目录 Understanding the difficulty of training deep feedforward neural networks ...
  • 翻译】设备注册和初始化 第5章和第6章中,我们了解了内核是如何识别网卡以及内核执行初始化过程以使网卡能够和驱动程序通讯。本章中,我们讨论初始化的其它阶段:l 网络设备什么时候,如何注册到内核l 网络设备...
  • 翻译】内核组件初始化体系结构 为了全面了解内核组件,你不仅需要了解特定的程序做了什么,也要知道这些程序什么时候被谁调用。内核子系统的初始化是一项基本任务,这些任务由内核根据它自己的模式来处理。这个...
  • DL之DNN优化技术:DNN中权重初始值优化【Xavier初始值】的简介、使用方法详细攻略 目录 【Xavier初始值】的简介 【Xavier初始值】的使用方法 【Xavier初始值】的简介 Xavier Glorot等人的论文中推荐...
  • 【OpenCV】Mat的初始

    千次阅读 2019-04-17 21:51:06
    【OpenCV】Mat的初始化和非初始化设值一、初始化设值例一例二二、非初始化设值例一例二...此为OpenCV的官方教程,英文版,浏览器有翻译功能的话可以翻译来看,整体大概还是看得懂的。 一、初始化设值 例一 直接进入...
  • python 初始化 元组 Python | 重新初始化元组 (Python | Reinitializing tuple) In this tutorial, we will learn how can we reinitialize a tuple with a new set of elements/objects? 在本教程中,我们将学习...
  • kotlin 类初始化 'init'关键字 ('init' keyword) The primary constructor does not contain any code, so the initialization code can be placed in the initializer block. 主构造函数不包含任何代码,因此可以将...
  • 神经网络权重初始化问题

    万次阅读 2017-09-01 12:24:26
    之前看Andrew大神的视频有介绍到神经网络权重需要随机初始化而不是全初始化为0的问题,其真正深层次的含义没有弄明白,所以结合一些资料(cs231n课程)希望能让自己之后再想到这个问题的时候能够快速地明白过来。...
  • 直接初始化与拷贝初始化学习笔记

    千次阅读 2006-11-10 10:21:00
    [说明] 本文是根据Herb Sutter的《More Exceptional C++》条款36的精简翻译笔记,不明之处,参考原文。1、直接初始化:使用单个构造函数(可能是转换构造函数)来初始化对象,形式如“T t(u)”。2、拷贝初始化:...
  • 初始化 数组 javaToday we will learn how to initialize an array in java. An array in java is a container that can hold a fixed number of values of the same type. The values can be of the primitive type...
  • SD卡初始化细节

    千次阅读 2018-07-27 14:10:43
    遇到了初始化中检测SD卡类型的问题,查看学习板带的源程序发现使用了CMD8命令进行判断SD卡的类型,在网上查了好久查不到有关SDV2.0中CMD8命令的详细描述,于是自己看了英文版的SDV2.0协议(2006),找出了CMD8命令的章节,...
  • c语言初始化程序 C ++中的初始化程序列表 (Initializer List in C++) Initializer list is used to initialize data members. The syntax begins with a colon(:) and then each variable along with its value ...
  • 读书笔记-内存初始化和清理

    千次阅读 2014-01-06 16:07:03
    在Java开发中,对象创建、数据关系、垃圾回收始终是不变的话题,今天我们来简单说一下初始化和清理的问题。 我们知道对象未被初始化即被使用,是要报错的,所以一般情况下在类构造方法里去赋初值,确保初始化工作的...
  • c++用数组初始化向量In this article, we’ll take a look at some of the ways to initialize a vector in C++. There are a bunch of ways to do this, so we’ll go through each approach. 在本文中,我们将介绍...
  • 早期Swift中Cocos2D初始化代码的重构

    千次阅读 2016-04-10 19:37:08
    大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请多提意见,如果觉得不错请多多支持点赞.谢谢! hopy ;) 我们知道在早期的Swift中在子类里只能调用超类的designated初始化器,这是Swift...
  • c语言中初始化一个数组In this article, we’ll take a look at how we will initialize an array in C. 在本文中,我们将研究如何在C中初始化数组。 There are different ways through which we can do this, so ...
  • 大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请多提意见,如果觉得不错请多多支持点赞.谢谢! hopy ;) 我没有在之前版本的Xcode中测试,不过很多人反映SKAudioNode的初始化代码在Xcode...
  • 初始化神经网络权重的方法总结

    千次阅读 2020-11-01 11:06:28
    在本文中,评估了权值初始化的许多方法和当前的最佳实践 零初始化 将权值初始化为零是不行的。那我为什么在这里提到它呢?要理解权值初始化的需要,我们需要理解为什么将权值初始化为零是无效的。 让我们考虑一个...
  • css 默认样式初始

    千次阅读 2018-09-27 23:07:23
    1.css reset:这个是我们在做项目时比较常用的一套css初始化样式,在这里就直接给出代码了 html, body, div, span, applet, object, iframe, h1, h2, h3, h4, h5, h6, p, blockquote, pre, a, abbr, acronym, ...
  • MySQL 5.6初始配置调优

    万次阅读 2014-06-07 18:41:39
    原文链接: What to tune in MySQL 5.6 after installation原文日期: 2013年09月17日翻译日期: 2014年06月01日翻译人员: 铁锚随着 大量默认选项的改进, MySQL 5.6比以前版本需要调优的选项大为减少. 在本文中我将讲述...
  • Item 4: 确保 objects(对象)在使用前被初始化作者:Scott Meyers译者:fatalerror99 (iTePubs Nirvana)发布:...在某些情形下,x 会被初始化(为 0),但是在其它情形下,也可能没
  • 我刚开始安装的是版本5.2,后面通过控制面板卸载了该软件,还另外卸载了其包含的组件iWebPDF;后来在安装6.6.2.1新版本的软件时,忘记了关闭杀毒软件avast,结果就报出了RT的错误。 解决方法其实也比较简单,通过...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 238,421
精华内容 95,368
关键字:

初始怎么翻译