Gradle自定義插件

本教程介紹了創建Gradle獨立自定義插件的方法。 它涵蓋以下主題
  • 創建任務,并在“自定義”插件中使用它
  • 獨立的自定義插件
  • 簡短的插件ID
  • 使用settings.gradle自定義Gradle設置

項目信息:

搖籃版本:1.1 操作系統平臺:Ubuntu 12.10 先決條件:基本了解Gradle腳本。
創建獨立的自定義插件

  1. 創建目錄結構
    |-custom-plugin|  |-plugin|    |-src|      |-main|      |  |-groovy|      |  | |-com|      |  |   |-code4reference |      |  |     |-gradle|      |  |-resources   |      |  | |-META-INF|      |  |   |-gradle-plugins |      |-test|      |  |-groovy|      |  | |-com|      |  |   |-code4reference |      |  |     |-gradle |-user

    這里的插件目錄包含所有源代碼和資源文件,而用戶目錄包含使用自定義插件的使用者腳本。 執行以下命令以創建目錄結構。 這里的groovy文件夾包含源代碼包。

    $ mkdir -p custom-plugin/plugin/src/main/groovy/com/code4reference/gradle$ mkdir -p custom-plugin/plugin/src/main/resources/META-INF/gradle-plugins$ mkdir -p custom-plugin/user
  2. 自定義插件源代碼

    每個插件都應該有一個實現類來擴展Plugin類。 讓我們定義插件類。

    package com.code4reference.gradle;import org.gradle.api.*;class Code4ReferencePlugin implements Plugin {def void apply(Project project) {//c4rTask task has been defined below.project.task('c4rTask') << {println 'Hi from Code4Reference plugin!'}}
    }

    將此文件放在custom-plugin / plugin / src / main / groovy / com / code4reference / gradle目錄中。 在這里, c4rTask任務已定義為打印一條簡單的線。

  3. 簡短的插件ID

    為了應用插件,我們通常使用一個簡短的ID,例如apply plugin:'java'。 這里的“ java”是org.gradle.api.plugins.JavaPlugin類的簡短插件ID。 簡短的插件ID可以通過簡單的步驟進行定義。 為此,我們需要創建一個屬性文件,并將其放在類路徑下的META-INF / gradle-plugins目錄中。 文件名將是我們的短ID。 該屬性文件必須包含以下所示的行,并且應指向插件實現類。 讓我們將屬性文件創建為code4reference.properties,并將其指向Code4ReferencePlugin類。

    implementation-class=com.code4reference.gradle.Code4ReferencePlugin
  4. Gradle腳本生成插件

    為了編譯和構建此插件,我們將編寫gradle腳本。 在插件目錄中創建名為build.gradle的文件, 然后在其中復制下面的內容。

    apply plugin: 'groovy'
    apply plugin: 'maven'
    dependencies {compile gradleApi()groovy localGroovy()
    }
    repositories {mavenCentral()
    }group='com.code4reference'   //Group name makes easier to manager the packages.
    version='1.1-SNAPSHOT'uploadArchives {repositories {mavenDeployer {repository(url: uri('../repo'))}}
    }

    在此gradle腳本中,我們使用groovy插件編譯groovy源代碼,并將gradleAPI聲明為編譯時間依賴項。 您可能已經注意到我們使用了maven插件。 它基本上會創建插件jar文件并將其存儲在maven存儲庫中。 在這里,我們在父目錄中創建名為repo的Maven存儲庫,并將jar文件存儲在其中。

  5. 構建插件并放入存儲庫
    $ gradle uploadArchives   #This will put the plugin-version.jar in maven repository.:compileJava UP-TO-DATE
    :compileGroovy UP-TO-DATE
    :processResources UP-TO-DATE
    :classes UP-TO-DATE
    :jar
    :uploadArchives
    Uploading: com/code4reference/plugin/1.1-SNAPSHOT/plugin-1.1-20120816.163101-1.jar to repository remote at file:/home/rakesh/programming/mygitrepo/Code4Reference/GradleExample/custom-plugin-1/repo/
    Transferring 5K from remote
    Uploaded 5KBUILD SUCCESSFULTotal time: 34.892 secs
  6. 使用settings.gradle注入設置

    當執行以上命令時,gradle會從settings.gradle中獲取項目名稱。 如果當前目錄中不存在settings.gradle文件,則它將獲取當前目錄的名稱并將其假定為項目名稱。 然后,它形成存儲jar文件的路徑。 文件路徑約定如下/group/name/projectName/version/projectname-version-timestamp.jar 。 您可能會在上面的輸出中注意到jar路徑名和jar文件名帶有插件字,因為當前目錄名是plugin,并且gradle假定它為項目名。 如果要覆蓋此屬性,并將code4ReferencePlugin作為項目名稱,則需要在插件目錄中創建settings.gradle文件,并放入下一行。

    rootProject.name = 'code4ReferencePlugin'

    現在再次執行命令以生成插件jar文件。

    $gradle uploadArchives
    compileJava UP-TO-DATE
    :compileGroovy UP-TO-DATE
    :processResources UP-TO-DATE
    :classes UP-TO-DATE
    :jar UP-TO-DATE
    :uploadArchives
    Uploading: com/code4reference/code4ReferencePlugin/1.1-SNAPSHOT/code4ReferencePlugin-1.1-20120816.164441-5.jar to repository remote at file:/home/rakesh/programming/mygitrepo/Code4Reference/GradleExample/custom-plugin-1/repo/
    Transferring 5K from remote
    Uploaded 5KBUILD SUCCESSFULTotal time: 8.61 secs

    現在問題解決了。 該jar將以名稱code4ReferencePlugin- [version] -timestamp.jar生成。 如果要查找有關gradle和系統屬性的更多信息,請在此處找到。

使用自定義插件

這確實是一個簡單的步驟。 盡管我們使用其他插件,但是自定義插件也可以類似的方式使用。 現在在用戶目錄中創建另一個build.gradle文件,并復制下面給出的代碼。

buildscript {repositories {maven {url uri('../repo')}}dependencies {classpath group: 'com.code4reference',name: 'code4ReferencePlugin',version: '1.1-SNAPSHOT'}
}
apply plugin: 'code4reference'

build.gradle腳本訪問父目錄中存在的Maven存儲庫。 我們還定義了依賴關系,該依賴關系基本上是從Maven訪問jar文件的特定版本。 最后但并非最不重要的一點是,我們應用簡短的插件ID“ code4reference”。 要運行此gradle腳本,請在用戶目錄中的終端上執行以下命令。

$ gradle c4rTask   #Remember we have created c4rTask in Code4ReferencePlugin class.#You will get the following output.
:c4rTask
Hi from Code4Reference plugin!BUILD SUCCESSFULTotal time: 3.908 secs

Voilà! 您剛剛創建了自定義插件,并在其他項目腳本中使用了它。 您可以在此處找到本教程的源代碼。 Code4參考

現在,將涵蓋以下主題。

  • 定義自定義任務類
  • 將參數傳遞給自定義插件任務
  • 嵌套參數
  • 測試自定義插件

項目信息:
項目名稱:Gradle自定義插件
搖籃版本:1.1 操作系統平臺:Ubuntu 12.10 先決條件:基本了解Gradle腳本。

在這里,我們將遵循第一部分中列出的相同目錄層次結構。

  1. 定義自定義任務

    讓我們定義一個名為Code4ReferenceTask的自定義類,該類擴展了DefaultTask類,并將此文件放在保存Code4ReferencePlugin.groovy的同一文件夾中。 這個類包含一個名為showMessage(),這是標注有@TaskAction方法。 執行任務時,Gradle會調用此方法。

    package com.code4reference.gradle;import org.gradle.api.DefaultTask
    import org.gradle.api.tasks.TaskActionclass Code4ReferenceTask extends DefaultTask {@TaskActiondef showMessage() {println '----------showMessage-------------'}
    }

    現在,我們需要在Code4ReferencePlugin.groovy中進行一些小的修改,以包含自定義任務。 修改后的Code4ReferencePlugin類如下。

    package com.code4reference.gradle;import org.gradle.api.*;class Code4ReferencePlugin implements Plugin {def void apply(Project project) {//Define the task named c4rTask of type Code4ReferenceTaskproject.task('c4rTask', type: Code4ReferenceTask)}
    }

    您可能會注意到,與過去的實現相比,只有突出顯示的行已更改。 現在,“ c4rTask”是Code4ReferenceTask類型的。 在插件目錄中執行gradle uploadArchives命令。 這將更新Maven存儲庫中的jar文件。 現在,使用相同的舊build.gradle在用戶目錄中執行以下命令。 我們將獲得以下輸出。

    $gradle c4rTask
    :c4rTask
    ----------showMessage-------------
    BUILD SUCCESSFULTotal time: 14.057 secs
  2. 將參數傳遞給自定義插件任務

    上面的實現是最簡單的,并沒有做很多事情。 如果我們想將Gradle腳本的參數傳遞給該任務怎么辦? 我們可以通過訪問擴展對象來實現。 Gradle項目具有一個關聯的ExtensionContainer對象,該對象有助于跟蹤傳遞給插件類的所有設置和屬性。 讓我們定義一個擴展類,它可以容納參數并將其傳遞給Task類。 Code4ReferencePlugin類中的突出顯示的行有助于將參數傳遞給Task類。

    package com.code4reference.gradle;import org.gradle.api.*;//For passing arguments from gradle script.
    class Code4ReferencePluginExtension {String message = 'Hello from Code4Reference'String sender = 'Code4Reference'
    }
    class Code4ReferencePlugin implements Plugin {def void apply(Project project) {project.extensions.create('c4rArgs', Code4ReferencePluginExtension)project.task('c4rTask', type: Code4ReferenceTask)}
    }

    我們已將Code4ReferencePluginExtension定義為Extension類,其中包含兩個變量message和sender。 這些用作自定義任務的參數。 我們需要修改Code4RefernceTask類以訪問參數。 高亮顯示的行已添加到以前的Code4ReferenceTask類實現中。

    package com.code4reference.gradle;import org.gradle.api.DefaultTask
    import org.gradle.api.tasks.TaskActionclass Code4ReferenceTask extends DefaultTask {@TaskActiondef showMessage() {println '------------showMessage-------------------'println 'From : ${project.c4rArgs.sender},\message : ${project.c4rArgs.message}'}
    }

    在插件目錄中執行gradle uploadArchives命令。 這將更新Maven存儲庫中的jar文件。 另外,我們需要更新用戶目錄中的build.gradle。

    //custom-plugin-2/user
    buildscript {repositories {maven {url uri('../repo')}}dependencies {classpath group: 'com.code4reference',name: 'code4ReferencePlugin',version: '1.2-SNAPSHOT'}
    }apply plugin: 'code4reference'c4rArgs {sender = 'Rakesh'message = 'Hello there !!!!'
    }

    您可能已經注意到,已經添加了c4rArgs閉包,并且在閉包中設置了發件人和消息變量。 這兩個變量可在showMessage()方法中訪問。 現在運行用戶目錄中存在的build.gradle。 我們得到以下輸出。

    $gradle c4rTask
    :c4rTask
    -------------------------showMessage-----------------------------
    From : Rakesh, message : Hello there !!!!BUILD SUCCESSFULTotal time: 15.817 secs
  3. 嵌套參數

    如果我們想傳遞嵌套參數怎么辦? 我們可以通過嵌套擴展對象來實現。 這是Code4ReferencePlugin類的代碼。 此類中僅添加了突出顯示的行。

    package com.code4reference.gradle;import org.gradle.api.*;//Extension class for nested argumetns
    class C4RNestedPluginExtention {String receiver = 'Admin'String email = 'admin@code4reference.com'}
    //For keeping passing arguments from gradle script.
    class Code4ReferencePluginExtension {String message = 'Hello from Code4Reference'String sender = 'Code4Reference'C4RNestedPluginExtention nested = new C4RNestedPluginExtention()
    }
    class Code4ReferencePlugin implements Plugin {def void apply(Project project) {project.extensions.create('c4rArgs', Code4ReferencePluginExtension)project.c4rArgs.extensions.create('nestedArgs',C4RNestedPluginExtention)project.task('c4rTask', type: Code4ReferenceTask)}
    }

    現在也該修改Code4ReferenceTask類。 在此類中添加了突出顯示的行,以訪問嵌套的參數。

    package com.code4reference.gradle;import org.gradle.api.DefaultTask
    import org.gradle.api.tasks.TaskActionclass Code4ReferenceTask extends DefaultTask {@TaskActiondef showMessage() {println '------------showMessage-------------------'println 'From : ${project.c4rArgs.sender},\message : ${project.c4rArgs.message}'println 'To : ${project.c4rArgs.nestedArgs.receiver},\email : ${project.c4rArgs.nestedArgs.email}'}
    }

    在插件目錄中再次執行gradle uploadArchives命令以更新Maven存儲庫中的jar文件。 現在,修改用戶目錄中存在的build.gradle文件以傳遞嵌套參數。

    buildscript {repositories {maven {url uri('../repo')}}dependencies {classpath group: 'com.code4reference',name: 'code4ReferencePlugin',version: '1.2-SNAPSHOT'}
    }apply plugin: 'code4reference'c4rArgs {sender = 'Rakesh'message = 'Hello there !!!!'nestedArgs{receiver = 'gradleAdmin'email = 'gradleAdmin@code4reference.com'}
    }

    我們已在build.gradle文件中添加了突出顯示的行。

  4. 測試插件和任務

    代碼測試是代碼開發的重要方面。 現在,我們將為自定義任務和插件添加單元測試。 為此,我們需要為測試類創建目錄結構。 我們需要將測試文件夾放在src目錄中。 在插件目錄中執行以下命令以創建測試目錄。

    $mkdir -p src/test/groovy/com/code4reference/gradle/

    測試目錄結構遵循用于源代碼包目錄的相同包目錄結構。 在此目錄中,放入Code4ReferencePlugin和Code4ReferenceTask的測試類。 在測試類中,ProjectBuilder用于訪問項目對象。 這些測試用例易于編寫,類似于Junit測試用例。 測試類的代碼如下:

    package com.code4reference.gradle;import org.junit.Test
    import org.gradle.testfixtures.ProjectBuilder
    import org.gradle.api.Project
    import static org.junit.Assert.*class Code4ReferenceTaskTest {@Testpublic void canAddTaskToProject() {Project project = ProjectBuilder.builder().build()def task = project.task('c4rtakstest', type: Code4ReferenceTask)assertTrue(task instanceof Code4ReferenceTask)}
    }
    package com.code4reference.gradle;import org.junit.Test
    import org.gradle.testfixtures.ProjectBuilder
    import org.gradle.api.Project
    import static org.junit.Assert.*class Code4ReferencePluginTest {@Testpublic void code4referencePluginAddsCode4ReferenceTaskToProject() {Project project = ProjectBuilder.builder().build()project.apply plugin: 'code4reference'println 'code4referencePluginAddsCode4ReferenceTaskToProject'assertTrue(project.tasks.c4rTask instanceof Code4ReferenceTask)}
    }

    要運行測試,請在plugin文件夾中執行以下命令。

    $gradle test                #For success test cases.
    :compileJava UP-TO-DATE
    :compileGroovy UP-TO-DATE
    :processResources UP-TO-DATE
    :classes UP-TO-DATE
    :compileTestJava UP-TO-DATE
    :compileTestGroovy
    :processTestResources UP-TO-DATE
    :testClasses
    :testBUILD SUCCESSFULTotal time: 42.799 secs$gradle test    #In case of test case failure,#you can expect output similar to given below.
    :compileJava UP-TO-DATE
    :compileGroovy UP-TO-DATE
    :processResources UP-TO-DATE
    :classes UP-TO-DATE
    :compileTestJava UP-TO-DATE
    :compileTestGroovy
    :processTestResources UP-TO-DATE
    :testClasses
    :testcom.code4reference.gradle.Code4ReferencePluginTest > code4referencePluginAddsCode4ReferenceTaskToProject FAILEDjava.lang.AssertionError at Code4ReferencePluginTest.groovy:142 tests completed, 1 failedFAILURE: Build failed with an exception.* What went wrong:
    Execution failed for task ':test'.
    > There were failing tests. See the report at: file:///home/rakesh/programming/mygitrepo/Code4Reference/GradleExample/custom-plugin-2/plugin/build/reports/tests/index.html* Try:
    Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output.BUILD FAILED

    Gradle測試提供了測試報告及其位置。 可以使用任何瀏覽器打開此文件以檢查堆棧跟蹤。

您可以在此處找到源代碼 。

參考: Gradle自定義插件(第1部分) , ? 我們的JCG合作伙伴 Rakesh Cusat的Gradle自定義插件(第2部分)位于Code4Reference博客上。


翻譯自: https://www.javacodegeeks.com/2012/08/gradle-custom-plugin.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/371244.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/371244.shtml
英文地址,請注明出處:http://en.pswp.cn/news/371244.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

mysql映射文件_Mybatis SQL映射文件

簡單查詢insert添加insert可以使用數據庫支持的自動生成主鍵策略&#xff0c;設置useGeneratedKeys”true”&#xff0c;然后把keyProperty 設成對應的列&#xff0c;就搞定了。比如說上面的StudentEntity 使用auto-generated 為id 列生成主鍵.還可以使用selectKey元素。下面例…

監聽微信、支付寶等移動app及瀏覽器的返回、后退、上一頁按鈕的事件方法

在實際的應用中&#xff0c;我們常常需要實現在移動app和瀏覽器中點擊返回、后退、上一頁等按鈕實現自己的關閉頁面、調整到指定頁面或執行一些其它操作的 需求&#xff0c;那在代碼中怎樣監聽當點擊微信、支付寶、百度糯米、百度錢包等app的返回按鈕或者瀏覽器的上一頁或后退按…

第七天作業

---恢復內容開始--- 作業一&#xff1a;nginx服務 二進制安裝nginx包 作為web服務修改配置文件 讓配置生效&#xff0c;驗證配置 直至出現epel的兩個文件&#xff0c;否則reinstall, 接下來寫配置文件&#xff0c; 這款軟件的服務目錄&#xff0c; 在里面編輯一些東西&#xff…

Java測試提示

介紹 我喜歡自動化測試。 在一次極少的轉移到op-ed 1中&#xff0c;我想到了一些想法&#xff08;閱讀–意見&#xff09;。 在開始如何最好地構成您的測試之前&#xff0c;我先簡單問一下–測試的原因是什么&#xff1f; 大致來說&#xff0c;我認為它們是&#xff1a; 減少…

pdo mysql fedora_在Fedora 23 Server和Workstation上安裝LAMP(Linux, Apache, MariaDB和PHP)

在安裝LAMP之前&#xff0c;建議先更新系統包$ sudo dnf update第一步&#xff1a;安裝Apache Web服務器1.在Fedora 23安裝Apache&#xff0c;你可以運行下面的命令&#xff1a;$ sudo dnf install httpd2.安裝完成后&#xff0c;我們設置在系統啟動時自動啟動Apache&#xff0…

洛谷P1937 [USACO10MAR]倉配置Barn Allocation

題目描述 Farmer John recently opened up a new barn and is now accepting stall allocation requests from the cows since some of the stalls have a better view of the pastures. The barn comprises N (1 < N < 100,000) stalls conveniently numbered 1..N; sta…

人臉數據庫大全(包括人臉識別、關鍵點檢測、表情識別,人臉姿態等等)

搞計算機視覺的人&#xff0c;對人臉技術并不陌生。在做實驗的時候需要各種數據集進行訓練&#xff0c;卻往往苦于找不到合適的數據集&#xff0c;這篇文章將給大家帶來一點福音。 目前為止最全的是人臉數據庫總結&#xff1a; The Color FERET Database, USA The FERET progra…

JavaFX游戲(四連環)

這是我的第一個JavaFX游戲教程&#xff0c;也是我關于JavaFX面板的第一篇博客文章。 我僅用200幾行代碼就完成了這款四連環游戲&#xff0c;足以應付一個簡單的游戲。 我在這里使用GridPane面板對磁盤進行布局&#xff0c;GridPane是JavaFX布局窗格之一&#xff0c;但它與另一個…

vs使用了未初始化的局部變量怎么解決_C程序為什么要初始化?

作者:守望,Linux應用開發者,目前在公眾號【編程珠璣】 分享Linux/C/C++/數據結構與算法/工具等原創技術文章和學習資源。 前言 什么是初始化?為什么要初始化?靜態變量和局部變量的初始化又有什么區別?實際應用中應該怎么做?本文將一一回答這些問題。 什么是初始化 初始化…

maven 配置 pom.xml 打包生成:單jar包/jar包+lib目錄

http://www.jianshu.com/p/9146cec6cc60轉載于:https://www.cnblogs.com/Baronboy/p/7510942.html

zabbix安裝MySQL失敗_MySQL數據庫之zabbix3.x安裝出現“configure: error: Not found mysqlclient library”的解決辦法...

本文主要向大家介紹了MySQL數據庫之zabbix3.x安裝出現“configure: error: Not found mysqlclient library”的解決辦法 &#xff0c;通過具體的內容向大家展現&#xff0c;希望對大家學習MySQL數據庫有所幫助。如題所示&#xff0c;在CentOS6.x的系統中安裝zabbix3.x&#xff…

拼圖項目:延期的后果

Mark Reinhold先生于2012年7月宣布 &#xff0c;他們計劃從Java 8撤回Jigsaw項目 &#xff0c;因為Jigsaw計劃于2013年9月&#xff08;從現在開始一年&#xff09;推遲其發布。 這個日期是眾所周知的&#xff0c;因為Oracle已決定實施Java的兩年路線圖計劃&#xff0c;因此2013…

Navicat下Oracle數據泵的使用簡單例子

如何使用Navicat等數據庫開發工具進行高效開發將是未來工作的重點。Navicat一來美觀而來夠操作夠傻瓜&#xff0c;使用得當其強大功能與PL SQL不相上下。今天學習就是如何在Navicat中使用數據泵進行數據導入導出。 數據泵使用前事項&#xff1a;想使用數據泵必須以sys或system等…

前端自動化之nvm安裝

nvm ——node環境版本控制工具。 1.解壓安裝包 2.打開setting文件&#xff0c;修改文件內容 root: D:\node\nvm path: D:\node\nodejs arch: 64 proxy: root&#xff1a;當前nvm所在的路徑 path&#xff1a;將root路徑的nvm改為nodejs arch&#xff1a;64位系統 3.配置環境變量…

mysql 主從復制介紹_MySQL 主從復制介紹

一、MySQL 主從復制簡介(1) MySQL 主從復制通過邏輯的 binlog 日志復制到要同步的服務器本地&#xff0c;然后由本地的線程讀取日志里面的 SQL 語句&#xff0c;重新應用到 MySQL 數據庫中(2) 在復制過程中&#xff0c;一臺服務器充當主服務器&#xff0c;接收來自用戶的內容更…

【Java面試題】18 java中數組有沒有length()方法?string沒有lenght()方法?下面這條語句一共創建了多少個對象:String s=a+b+c+d;...

數組沒有length()這個方法&#xff0c;有length的屬性。String有有length()這個方法。 int a[]; a.length;//返回a的長度 String s; s.length();//返回s的長度 java中數組沒有length()方法&#xff0c;求數組的長度可以使用數組的length屬性。 int[] arr{1,2,3,4,5};int length…

Spring范圍代理

考慮以這種方式定義的兩個Spring bean&#xff1a; Component class SingletonScopedBean{Autowired private PrototypeScopedBean prototypeScopedBean;public String getState(){return this.prototypeScopedBean.getState();} }Component Scope(value"prototype")…

遞歸和分治的概念性的理解

遞歸的概念表述&#xff1a; 直接或間接調用自身的算法稱為遞歸算法。 理解&#xff1a;遞歸算法的可以理解為多個算法的嵌套調用&#xff0c;只是調用算法是同一個&#xff0c;同時需要一個工作棧來作為各層次的數據存儲區&#xff0c;包括所有實參指針&#xff0c;局部變量&a…

ibatis mysql sqlmapconfig_iBATIS sqlMapConfig配置詳解

1 <?xml version"1.0" encoding"UTF-8"?>2 "http://ibatis.apache.org/dtd/sql-map-config-2.dtd">5 6 11 13 enhancementEnabled"true"14 lazyLoadingEnabled"true"15 errorTracingEnabled"true"16 m…

什么情況使用 weak 關鍵字,相比 assign 有什么不同?

什么情況使用 weak 關鍵字&#xff1f; 在 ARC 中,在有可能出現循環引用的時候,往往要通過讓其中一端使用 weak 來解決,比如: delegate 代理屬性 自身已經對它進行一次強引用,沒有必要再強引用一次,此時也會使用 weak,自定義 IBOutlet 控件屬性一般也使用 weak&#xff1b;當然…