主頁 > 移動端開發 > 這個坑我都說了很多遍了,怎么還有人踩?Kotlin可能帶來的一個深坑(最后一次提醒)

這個坑我都說了很多遍了,怎么還有人踩?Kotlin可能帶來的一個深坑(最后一次提醒)

2021-02-07 14:28:14 移動端開發

寫在前面

去年,哦不,前年五月的時候,谷歌宣布了Kotlin-First 這一重要概念,主張Kotlin 是 Android 開發者的首選語言,

訊息發出去后,很多人心中都有了一個疑問:那我一個搞Android開發的,我現在是不是以后就只用學Kotlin 就可以了?

一般有這個疑問或者想法的人都是外行人或者說是入行不久的人,

今天在這里就分享一個行業大佬的看法吧,本文也可以當做移動開發新手手冊,希望本文對大家有幫助,

來自公眾號:承香墨影

本文內容:

  • Kotlin可能帶來的坑
  • 分析總結
  • 移動開發學習

Kotlin可能帶來的坑

一. 前言

新語言有新特性,開發者還保持 Java 的編程習慣去寫 Kotlin,也不是不行,但是總感覺差點意思,

最近公眾號「谷歌開發者」連載了一個《實用 Kotlin 構建 Android 應用 | Kotlin 遷移指南》的系列文章,就舉例了一些 Kotlin 編碼的小技巧,

既然是一種指南性質的文章,自然在「多而廣」的基礎上,有意去省略一些細節,同時舉例的場景,可能還有一些不恰當的地方,

這里我就來補齊這些細節,今天聊聊利用 Kotlin 的方法默認引數的特性,完成類似 Java 的方法多載的效果,完全決議這個特性的使用方式和原理,以及在使用程序中的一個深坑,

二. Kotlin 的簡易方法多載

2.1 Kotlin 如何簡化方法多載?

在 Java 中,我們可以在同一個類中,定義多個同名的方法,只需要保證每個方法具有不同的引數型別或引數個數,這就是 Java 的方法多載

class Hello {
    public static void hello() {
        System.out.println("Hello, world!");
    }

    public static void hello(String name) {
        System.out.println("Hello, "+ name +"!");
    }

    public static void hello(String name, int age) {
        if (age > 0) {
            System.out.println("Hello, "+ name + "(" +age +")!");
        } else {
            System.out.println("Hello, "+ name +"!");
        }
    }
}

在這個例子中,我們定義了三個同名的 hello() 方法,具有不同的邏輯細節,

在 Kotlin 中,因為它支持在同一個方法里,通過 「?」標出可空引數,以及通過「=」給出引數的默認值,那這三個方法就可以在 Kotlin 中,被柔和成一個方法,

object HelloDemo{
    fun hello(name: String = "world", age: Int = 0) {
        if (age > 0) {
            System.out.println("Hello, ${name}(${age})!");
        } else {
            System.out.println("Hello, ${name}!");
        }
    }
}

在 Kotlin 類中呼叫,和前面 Java 實作的效果是一致的,

HelloDemo.hello()
HelloDemo.hello("承香墨影")
HelloDemo.hello("承香墨影", 16)

但是這個通過 Kotlin 方法引數默認值的特性申明的方法,在 Java 類中使用時,就有些區別了,因為 HelloDemo 類被宣告為 object,所以在 Java 中需要使用 INSTANCE 來呼叫它的方法,

HelloDemo.INSTANCE.hello("承香墨影",16);

Kotlin 中呼叫 hello() 方法很方便,可以選擇性的忽略引數,但是在 Java 中使用,必須全量的顯式的去做引數賦值,

這就是使用了引數默認值的方法申明時,分別在 Kotlin 和 Java 中的使用方式,接下來我們看看原理,

2.2 Kotlin 方法引數指定默認值的原理

Kotlin 撰寫的代碼,之所以可以在 Java 系的虛擬機中運行,主要是因為它在編譯的程序中,會被編譯成虛擬機可識別的 Java 位元組碼,所以我們通過兩次轉換的方式(Show Kotlin Bytecode + Decompile),就可以得到 Kotlin 生成的對應 Java 代碼了,

public final void hello(@NotNull String name, int age) {
  Intrinsics.checkParameterIsNotNull(name, "name");
  if (age > 0) {
     System.out.println("Hello, " + name + '(' + age + ")!");
  } else {
     System.out.println("Hello, " + name + '!');
  }
}

// $FF: synthetic method
public static void hello$default(HelloDemo var0, String var1, int var2, int var3, Object var4) {
  if ((var3 & 1) != 0) {
     var1 = "world";
  }

  if ((var3 & 2) != 0) {
     var2 = 0;
  }
  var0.hello(var1, var2);
}

在這里會生成一個 hello() 方法,同時還會有一個合成方法(synthetic method)hello$default,用來處理默認引數的問題,在 Kotlin 中呼叫 hello() 方法,會在編譯期間,有選擇性的自動替換成 hello() 的合成方法去呼叫,

// Kotlin 呼叫
HelloDemo.hello()
HelloDemo.hello("承香墨影")
HelloDemo.hello("承香墨影", 16)

// 編譯后的 Java 代碼
HelloDemo.hello$default(HelloDemo.INSTANCE, (String)null, 0, 3, (Object)null);
HelloDemo.hello$default(HelloDemo.INSTANCE, "承香墨影", 0, 2, (Object)null);
HelloDemo.INSTANCE.hello("承香墨影", 16);

注意看示例的末尾,當使用 hello(name,age) 這個方法多載時,其實與 Java 中的呼叫,是一致的,這沒什么好說的,

這就是 Kotlin 方法多載時,使用指定默認引數的方式,省去多個方法多載代碼的原理,

理解原理后,發現它確實減少了我們撰寫的代碼量,但是有沒有場景,是我們就需要顯式的存在這幾個方法的多載的?自然是有的,例如自定義 View 時,

三. 自定義 View 遇上 Kotlin

3.1 構造方法也是方法

再回到前面提到的谷歌開發者的《實用 Kotlin 構建 Android 應用 | Kotlin 遷移指南》系列文章中,舉的例子其實很不恰當,

它這里的例子中,使用了 View 這個詞,并且多載的幾個方法,都是 View 的構造方法,我們在自定義 View 時,經常會和這三個方法打交道,

但是谷歌工程師在這里舉的例子,很容易讓人誤會,實際上你如果在自定義 View 時,這么寫一定是會報錯的,

例如我們自定義一個 DemoView,它繼承自 EditView,

class DemoView(
        context: Context, 
        attrs: AttributeSet? = null, 
        defStyleAttr: Int = 0
) : EditText(context, attrs, defStyleAttr) {
}

這個自定義的 DemoView,當使用在 XML 布局中時,雖然編譯不會出錯,但是運行時,你會得到一個 NoSuchMethodException,

Caused by: java.lang.NoSuchMethodException: <init> [class android.content.Context, interface android.util.AttributeSet]

什么問題呢?

在 LayoutInflater 創建控制元件時,找不到 DemoView(Context, AttributeSet) 這個多載方法,所以就報錯了,

這其實很好理解,在前面說到 Kotlin 在使用帶默認值的方法的原理,其實 Kotlin 最侄訓在編譯后,額外生成一個合成方法,來處理方法的引數默認值的情況,它和 Java 的方法多載還不一樣,用它生成的方法,確實不會存在多個方法的多載,

所以要明白,Kotlin 的方法指定默認引數與 Java 的方法多載,并不等價,只能說它們在某些場景下,特性是類似的,

3.2 使用 @JvmOverloads

那么回到這里的問題,在自定義 View 或者其他需要保留 Java 方法多載的場景下,怎么讓 Kotlin 在編譯時,真實的去生成對應的多載方法?

這里就需要用到 @JvmOverloads 了,

當 Kotlin 使用了默認值的方法,被增加了 @JvmOverloads 注解后,它的含義就是在編譯時,保持并暴露出該方法的多個多載方法

其實當我們自定義 View 時,AS 已經給了我們充分的提示,它會自動幫我們生成帶@JvmOverloads 構造方法,

AS 幫我們補全的代碼如下:

class DemoView @JvmOverloads constructor(
        context: Context, 
        attrs: AttributeSet? = null, 
        defStyleAttr: Int = 0
) : AppCompatEditText(context, attrs, defStyleAttr) {
}

再用「Kotlin Bytecode + Decompile」查看一下編譯后的代碼,來驗證 @JvmOverloads的效果,

@JvmOverloads
public DemoView(@NotNull Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
  Intrinsics.checkParameterIsNotNull(context, "context");
  super(context, attrs, defStyleAttr);
}

// $FF: synthetic method
public DemoView(Context var1, AttributeSet var2, int var3, int var4, DefaultConstructorMarker var5) {
  if ((var4 & 2) != 0) {
     var2 = (AttributeSet)null;
  }

  if ((var4 & 4) != 0) {
     var3 = 0;
  }

  this(var1, var2, var3);
}

@JvmOverloads
public DemoView(@NotNull Context context, @Nullable AttributeSet attrs) {
  this(context, attrs, 0, 4, (DefaultConstructorMarker)null);
}

@JvmOverloads
public DemoView(@NotNull Context context) {
  this(context, (AttributeSet)null, 0, 6, (DefaultConstructorMarker)null);
}

可以看到,@JvmOverloads 生效后,會按照我們的預期生成對應的多載方法,同時保留合成方法,完成在 Kotlin 中使用時,使用默認引數的需求,

是不是以為到這里就完了?并不是,如果你在自定義 View 時,完全按照 AS 給你的提示生成代碼,雖然程式不會崩潰了,但你會得到一些未知的錯誤,

3.3 View 中別直接用 AS 生成代碼

在自定義 View 時,依賴 AS 的提示生成代碼,會遇到一些未知的錯誤,例如在本文的例子中,我們想要實作一個 EditView 的子類,用 AS 提示生成了代碼,

會出現什么問題呢?

在 EditView 的場景下,你會發現焦點沒有了,點擊之后軟鍵盤也不會自動彈出,

那為什么會出現這種問題?

原因就在 AS 在自動生成的代碼時,對引數默認值的處理,

當在自定義 View 時,通過 AS 生成多載方法時,它對引數默認值的處理規則是這樣的,

  1. 遇到物件,默認值為 null,

  2. 遇到基礎資料型別,默認值為基本資料型別的默認值,例如 Int 就是 0,Boolean 就是 false,

而在這里的場景下, defStyleAttr 這個引數的型別為 Int,所以默認值會被賦值為 0,但是它并不是我們需要的,

在 Android 中,當 View 通過 XML 檔案來布局使用時,會呼叫兩個引數的構造方法(Context context, AttributeSet attrs),而它內部會呼叫三個引數的構造方法,并傳遞一個默認的 defStyleAttr,注意它并不是 0,

既然找到了問題,就很好解決了,我們看看自定義 View 的父類中,兩個引數的構造方法如何實作的,將 defStyleArrt 當默認值傳遞進去就好了,

那我們先看看 AppCompatEditText 中的實作,

public AppCompatEditText(Context context, 
                         AttributeSet attrs) {
    this(context, attrs, R.attr.editTextStyle);
}

再修改 DemoView 中對 defStyleAttr 默認值的指定即可,

class DemoView @JvmOverloads constructor(
        context: Context,
        attrs: AttributeSet? = null, 
        defStyleAttr: Int = R.attr.editTextStyle
) : AppCompatEditText(context, attrs, defStyleAttr) {
}

到這里,自定義 View 中,使用默認引數的構造方法多載問題,也解決了,

在自定義 View 的場景下,當然也可以通過重寫多個 constructor 方法來實作類似的效果,但是既然已經明白了它的原理,那就放心大膽的使用吧,

二、小結時刻

到這里就弄清楚 Kotlin 中,使用默認引數來減少方法多載代碼的使用技巧和原理,以及注意事項了,

弄清楚原理以及需要注意的點,可以幫助我們更好的使用 Kotlin 的特性,我們最后再總結一下本文的知識點:

  1. Kotlin 可以通過對一個方法的引數,通過指定默認值的方式,來完成類似 Java 中「方法多載」的效果,

  2. 若想保留 Java 的多載方法,可以使用 @JvmOverloads 注解標記,它會自動生成該方法的全部多載方法,

  3. 在自定義 View 時,需要注意指定引數 defStyleAttr 的默認值,而不應該是 0,

三、移動開發學習指南

上面已經對Kotlin可能帶來的一個深坑進行了決議,我想大家心中對一開始的問題也有了答案,

移動開發,特別是Android 開發,現在依然是以Java語言為主(Java語言依然是最通用的),現在的Android 開發需要學習的東西主要是以下內容 ,

(一)架構師筑基語言基礎

目前Android APP開發主流語言就是Java語言,Java語言最大的特性就是提高了軟體的互動可能性,可以說安卓手機幾乎所有應用程式都是利用Java語言來進行撰寫的,

知識要點:
1、深入理解Java泛型
2、注解深入淺出
3、并發編程
4、資料傳輸與序列化
5、Java虛擬機原理
6、高效IO

image

(二)設計思想解讀開源框架

隨著互聯網企業的不斷發展,產品專案中的模塊越來越多,用戶體驗要求也越來越高,想實作小步快跑、快速迭代的目的越來越難,插件化技術應用而生,如果沒有插件化技術,美團、淘寶這些集成了大量“app”的應用,可能會有幾個g那么大,

所以,當今的Android移動開發,不會熱修復、插件化、組件化,80%以上的面試都過不了,

知識要點:
1、熱修復設計
2、插件化框架設計
3、組件化框架設計
4、圖片加載框架
5、網路訪問框架設計
6、RXJava回應式編程框架設計

image

(三)360°全方位性能調優

在不同層次的開發工程師手里,因為技術水平的參差不齊,即使很多手機在跑分軟體性能非常高,打開應用依然存在卡頓現象,

另外,隨著產品內容迭代,功能越來越復雜,UI頁面也越來越豐富,也成為流暢運行的一種阻礙,綜上所述,對APP進行性能優化已成為開發者該有的一種綜合素質,也是開發者能夠完成高質量應用程式作品的保證,

知識要點:
1、設計思想與代碼質量優化
2、程式性能優化
啟動速度與執行效率優化
布局檢測與優化
記憶體優化
耗電優化
網路傳輸與資料儲存優化
APK大小優化

3、開發效率優化
分布式版本控制系統Git
自動化構建系統Gradle

4、專案實戰
啟動速度
流暢度
抖音在APK包大小資源優化的實踐
優酷回應式布局技術全決議
網路優化
手機淘寶雙十一性能優化專案揭秘
高德APP全鏈路原始碼依賴分析
徹底干掉OOM的實戰經驗分享
微信Android終端記憶體優化實踐

image

(四)Android框架體系架構

Android框架體系架構(高級UI+FrameWork原始碼) 這塊知識是現今使用者最多的,我們稱之Android2013~2016年的技術,

Android開發者也往往因為網上Copy代碼習慣了而導致對這塊經常“使用”的代碼熟悉而又陌生:熟悉的是幾乎天天在和它們打交道, 天天在復制這些代碼 ;陌生的是雖然天天和這些代碼打交道,但是并沒有深入研究過這些代碼的原理,代碼深處的內涵,

知識要點:
1、高級UI晉升
2、Android內核組件
3、大型專案必備IPC
4、資料持久與序列化
5、Framework內核決議**

image

(五)NDK模塊開發(音視頻開發系列)

NDK(Native Development Kit縮寫)一種基于原生程式介面的軟體開發工具包,可以讓您在 Android 應用中利用 C 和 C++ 代碼的工具,通過此工具開發的程式直接在本地運行,而不是虛擬機,

在Android中,NDK是一系列工具的集合,主要用于擴展Android SDK,NDK提供了一系列的工具可以幫助開發者快速的開發C或C++的動態庫,并能自動將so和Java應用一起打包成apk,

知識要點:
1、NDK開發之C/C++入門
2、JNI模塊開發
3、Linux編程
4、底層圖片處理
5、音視頻開發
6、機器學習

image

(六)Flutter學習進階

2020 年無疑是 Flutter 技術如火如荼發展的一年,現在這門技術也依然非常有價值,

每一個移動開發者都在為 Flutter 帶來的“快速開發、富有表現力和靈活的 UI、原生性能”的特色和理念而癡狂,從超級 App 到獨立應用,從純 Flutter 到混合堆疊,開發者們在不同的場景下樂此不疲的探索和應用著 Flutter 技術,也在面臨著各種各樣不同的挑戰,

知識要點:
1、Flutter跨平臺開發概述
2、Windows中Flutter開發環境搭建
3、撰寫你的第一個Flutter APP
4、Flutter Dart語言系統入門**
……

image

(七)微信小程式開發

微信小程式作為現在比較火的編程開發應用場景之一,深受市場的青睞,這讓不少開發者眼饞不已,但是對于初學者來說,就完全摸不著頭腦了,不知道微信小程式開發制作需要學習那些知識,有需要的朋友可以參考本篇,

本篇知識要點:
1、小程式概述及入門
2、小程式UI開發
3、API操作
4、購物商場專案實戰

image

(八)Android相關原始碼解讀

這里大家可以去看這一篇文章:牛掰!阿里P7大佬爆肝半個月,把安卓原始碼決議編成了508頁的PDF,

文中完整版資料已經整理成為PDF檔案,感興趣的朋友可以點擊此處,快速獲取!希望能幫助到大家!

最后

祝大家作業順利!預祝新年快樂!

Android 開發之路,你我共勉!2021年,一起牛掰!

轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/257495.html

標籤:其他

上一篇:Android 最完整的仿QQ表情聊天圖文展示代碼示例

下一篇:Codeforces Round #699 (Div. 2)-AB題

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 【從零開始擼一個App】Dagger2

    Dagger2是一個IOC框架,一般用于Android平臺,第一次接觸的朋友,一定會被搞得暈頭轉向。它延續了Java平臺Spring框架代碼碎片化,注解滿天飛的傳統。嘗試將各處代碼片段串聯起來,理清思緒,真不是件容易的事。更不用說還有各版本細微的差別。 與Spring不同的是,Spring是通過反射 ......

    uj5u.com 2020-09-10 06:57:59 more
  • Flutter Weekly Issue 66

    新聞 Flutter 季度調研結果分享 教程 Flutter+FaaS一體化任務編排的思考與設計 詳解Dart中如何通過注解生成代碼 GitHub 用對了嗎?Flutter 團隊分享如何管理大型開源專案 插件 flutter-bubble-tab-indicator A Flutter librar ......

    uj5u.com 2020-09-10 06:58:52 more
  • Proguard 常用規則

    介紹 Proguard 入口,如何查看輸出,如何使用 keep 設定入口以及使用實體,如何配置壓縮,混淆,校驗等規則。

    ......

    uj5u.com 2020-09-10 06:59:00 more
  • Android 開發技術周報 Issue#292

    新聞 Android即將獲得類AirDrop功能:可向附近設備快速分享檔案 谷歌為安卓檔案管理應用引入可安全隱藏資料的Safe Folder功能 Android TV新主界面將顯示電影、電視節目和應用推薦內容 泄露的Android檔案暗示了傳說中的谷歌Pixel 5a與折疊屏新機 谷歌發布Andro ......

    uj5u.com 2020-09-10 07:00:37 more
  • AutoFitTextureView Error inflating class

    報錯: Binary XML file line #0: Binary XML file line #0: Error inflating class xxx.AutoFitTextureView 解決: <com.example.testy2.AutoFitTextureView android: ......

    uj5u.com 2020-09-10 07:00:41 more
  • 根據Uri,Cursor沒有獲取到對應的屬性

    Android: 背景:呼叫攝像頭,拍攝視頻,指定保存的地址,但是回傳的Cursor檔案,只有名稱和大小的屬性,沒有其他諸如時長,連ID屬性都沒有 使用 cursor.getInt(cursor.getColumnIndexOrThrow(MediaStore.Video.Media.DURATIO ......

    uj5u.com 2020-09-10 07:00:44 more
  • Android連載29-持久化技術

    一、持久化技術 我們平時所使用的APP產生的資料,在記憶體中都是瞬時的,會隨著斷電、關機等丟失資料,因此android系統采用了持久化技術,用于存盤這些“瞬時”資料 持久化技術包括:檔案存盤、SharedPreference存盤以及資料庫存盤,還有更復雜的SD卡記憶體儲。 二、檔案存盤 最基本存盤方式, ......

    uj5u.com 2020-09-10 07:00:47 more
  • Android Camera2Video整合到自己專案里

    背景: Android專案里呼叫攝像頭拍攝視頻,原本使用的 MediaStore.ACTION_VIDEO_CAPTURE, 后來因專案需要,改成了camera2 1.Camera2Video 官方demo有點問題,下載后,不能直接整合到專案 問題1.多次拍攝視頻崩潰 問題2.雙擊record按鈕, ......

    uj5u.com 2020-09-10 07:00:50 more
  • Android 開發技術周報 Issue#293

    新聞 谷歌為Android TV開發者提供多種新功能 Android 11將自動填表功能整合到鍵盤輸入建議中 谷歌宣布Android Auto即將支持更多的導航和數字停車應用 谷歌Pixel 5只有XL版本 搭載驍龍765G且將比Pixel 4更便宜 [圖]Wear OS將迎來重磅更新:應用啟動時間 ......

    uj5u.com 2020-09-10 07:01:38 more
  • 海豚星空掃碼投屏 Android 接收端 SDK 集成 六步驟

    掃碼投屏,開放網路,獨占設備,不需要額外下載軟體,微信掃碼,發現設備。支持標準DLNA協議,支持倍速播放。視頻,音頻,圖片投屏。好點意思。還支持自定義基于 DLNA 擴展的操作動作。好像要收費,沒體驗。 這里簡單記錄一下集成程序。 一 跟目錄的build.gradle添加私有mevan倉庫 mave ......

    uj5u.com 2020-09-10 07:01:43 more
最新发布
  • 歡迎頁輪播影片

    如圖,引導開始,球從上落下,同時淡入文字,然后文字開始輪播,最后一頁時停止,點擊進入首頁。 在來看看效果圖。 重力球先不講,主要歡迎輪播簡單實作 首先新建一個類 TextTranslationXGuideView,用于影片展示 文本是類似的,最后會有個圖片箭頭影片,布局很簡單,就是一個 TextVi ......

    uj5u.com 2023-04-20 08:40:31 more
  • 【FAQ】關于華為推送服務因營銷訊息頻次管控導致服務通訊類訊息

    一. 問題描述 使用華為推送服務下發IM訊息時,下發訊息請求成功且code碼為80000000,但是手機總是收不到訊息; 在華為推送自助分析(Beta)平臺查看發現,訊息發送觸發了頻控。 二. 問題原因及背景 2023年1月05日起,華為推送服務對咨詢營銷類訊息做了單個設備每日推送數量上限管理,具體 ......

    uj5u.com 2023-04-20 08:40:11 more
  • 歡迎頁輪播影片

    如圖,引導開始,球從上落下,同時淡入文字,然后文字開始輪播,最后一頁時停止,點擊進入首頁。 在來看看效果圖。 重力球先不講,主要歡迎輪播簡單實作 首先新建一個類 TextTranslationXGuideView,用于影片展示 文本是類似的,最后會有個圖片箭頭影片,布局很簡單,就是一個 TextVi ......

    uj5u.com 2023-04-20 08:39:36 more
  • 【FAQ】關于華為推送服務因營銷訊息頻次管控導致服務通訊類訊息

    一. 問題描述 使用華為推送服務下發IM訊息時,下發訊息請求成功且code碼為80000000,但是手機總是收不到訊息; 在華為推送自助分析(Beta)平臺查看發現,訊息發送觸發了頻控。 二. 問題原因及背景 2023年1月05日起,華為推送服務對咨詢營銷類訊息做了單個設備每日推送數量上限管理,具體 ......

    uj5u.com 2023-04-20 08:39:13 more
  • iOS從UI記憶體地址到讀取成員變數(oc/swift)

    開發除錯時,我們發現bug時常首先是從UI顯示發現例外,下一步才會去定位UI相關連的資料的。XCode有給我們提供一系列debug工具,但是很多人可能還沒有形成一套穩定的除錯流程,因此本文嘗試解決這個問題,順便提出一個暴論:UI顯示例外問題只需要兩個步驟就能完成定位作業的80%: 定位例外 UI 組 ......

    uj5u.com 2023-04-19 09:16:23 more
  • FIDE重磅更新!性能飛躍!體驗有禮!

    FIDE 開發者工具重構升級啦!實作500%性能提升,誠邀體驗! 一直以來不少開發者朋友在社區反饋,在使用 FIDE 工具的程序中,時常會遇到諸如加載不及時、代碼預覽/渲染性能不如意的情況,十分影響開發體驗。 作為技術團隊,我們深知一件趁手的開發工具對開發者的重要性,因此,在2023年開年,FinC ......

    uj5u.com 2023-04-19 09:16:15 more
  • 游戲內嵌社區服務開放,助力開發者提升玩家互動與留存

    華為 HMS Core 游戲內嵌社區服務提供快速訪問華為游戲中心論壇能力,支持玩家直接在游戲內瀏覽帖子和交流互動,助力開發者擴展內容生產和觸達的場景。 一、為什么要游戲內嵌社區? 二、游戲內嵌社區的典型使用場景 1、游戲內打開論壇 您可以在游戲內繪制論壇入口,為玩家提供沉浸式發帖、瀏覽、點贊、回帖、 ......

    uj5u.com 2023-04-19 09:15:46 more
  • iOS從UI記憶體地址到讀取成員變數(oc/swift)

    開發除錯時,我們發現bug時常首先是從UI顯示發現例外,下一步才會去定位UI相關連的資料的。XCode有給我們提供一系列debug工具,但是很多人可能還沒有形成一套穩定的除錯流程,因此本文嘗試解決這個問題,順便提出一個暴論:UI顯示例外問題只需要兩個步驟就能完成定位作業的80%: 定位例外 UI 組 ......

    uj5u.com 2023-04-19 09:14:53 more
  • FIDE重磅更新!性能飛躍!體驗有禮!

    FIDE 開發者工具重構升級啦!實作500%性能提升,誠邀體驗! 一直以來不少開發者朋友在社區反饋,在使用 FIDE 工具的程序中,時常會遇到諸如加載不及時、代碼預覽/渲染性能不如意的情況,十分影響開發體驗。 作為技術團隊,我們深知一件趁手的開發工具對開發者的重要性,因此,在2023年開年,FinC ......

    uj5u.com 2023-04-19 09:14:08 more
  • 游戲內嵌社區服務開放,助力開發者提升玩家互動與留存

    華為 HMS Core 游戲內嵌社區服務提供快速訪問華為游戲中心論壇能力,支持玩家直接在游戲內瀏覽帖子和交流互動,助力開發者擴展內容生產和觸達的場景。 一、為什么要游戲內嵌社區? 二、游戲內嵌社區的典型使用場景 1、游戲內打開論壇 您可以在游戲內繪制論壇入口,為玩家提供沉浸式發帖、瀏覽、點贊、回帖、 ......

    uj5u.com 2023-04-19 09:08:34 more