<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[金鱼的博客]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/littleFish_ZYY</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; littleFish_ZYY]]></copyright><item><title><![CDATA[微信小程序+Taro 混编，Taro 使用微信原生 behaviors]]></title><link>https://blog.youkuaiyun.com/littleFish_ZYY/article/details/132470510</link><guid>https://blog.youkuaiyun.com/littleFish_ZYY/article/details/132470510</guid><author>littleFish_ZYY</author><pubDate>Thu, 24 Aug 2023 16:02:21 +0800</pubDate><description><![CDATA[最近有一个小程序项目，因为一些原因项目架构选择了微信小程序原生+Taro 混编的方式进行开发，在开发的过程中发现 Taro 不支持使用原生的 behaviors 特性，因为混编的原因项目当中已有原生页面在使用 behaviors，所以需要一个方案在不影响其他页面的基础上使 Taro 也能使用这一特性。（它使用了 behaviors）到 Taro 页面做为中转的方式解决了这一棘手的问题。通过中转组件就可以在 Taro 页面调用到 behaviors 的方法，以及使用 behaviors 生命周期的封装。]]></description><category></category></item><item><title><![CDATA[iOS-透明的 webView]]></title><link>https://blog.youkuaiyun.com/littleFish_ZYY/article/details/131068847</link><guid>https://blog.youkuaiyun.com/littleFish_ZYY/article/details/131068847</guid><author>littleFish_ZYY</author><pubDate>Tue, 06 Jun 2023 15:38:14 +0800</pubDate><description><![CDATA[原生 app 上放置一张撑满屏幕的图片，创建一个 webView 盖在图片上。要实现 webView 是透明的效果需要。]]></description><category></category></item><item><title><![CDATA[iOS OC 实现 swift defer 效果]]></title><link>https://blog.youkuaiyun.com/littleFish_ZYY/article/details/122586675</link><guid>https://blog.youkuaiyun.com/littleFish_ZYY/article/details/122586675</guid><author>littleFish_ZYY</author><pubDate>Wed, 19 Jan 2022 18:10:03 +0800</pubDate><description><![CDATA[swift 中有个我很喜欢的用法：defer。效果是，当 defer 所在作用域将要结束时，系统会调用 defer 花括号里的内容。

比如，请求接口时需要展示 loading，接口完成或者某些条件不满足下要移除 loading，这时可能需要在多处调用移除 loading，一是可读性不强，二是很有可能会忘记调用移除 loading 代码。这时，defer 就派上用场了。
func requestData() {
	defer {
		hideLoading()
	}
	showLoading()
	....]]></description><category></category></item><item><title><![CDATA[iOS Block clang 转 c++ 后底层解析]]></title><link>https://blog.youkuaiyun.com/littleFish_ZYY/article/details/120045048</link><guid>https://blog.youkuaiyun.com/littleFish_ZYY/article/details/120045048</guid><author>littleFish_ZYY</author><pubDate>Wed, 01 Sep 2021 19:43:18 +0800</pubDate><description><![CDATA[有一个类 BlockClass, 该类有一个类方法 +funcTest
情景一: 为什么外界修改了变量 a 的值, 调用block时打印的值不变?
#import "BlockClass.h"
@implementation BlockClass
+ (void) funcTest {
    int a = 10;
    NSLog(@"a1: %p, %d", &amp;a,a);
    void(^blockName)(void) = ^{
        NSLog(@"block 内 a: %]]></description><category></category></item><item><title><![CDATA[iOS AutoreleasePool 原理]]></title><link>https://blog.youkuaiyun.com/littleFish_ZYY/article/details/120020563</link><guid>https://blog.youkuaiyun.com/littleFish_ZYY/article/details/120020563</guid><author>littleFish_ZYY</author><pubDate>Tue, 31 Aug 2021 20:41:55 +0800</pubDate><description><![CDATA[@autoreleasepool {
    Person *p = [Person new];
}

等价于


void *atautoreleasepoolobj = objc_autoreleasePoolPush();
Person *p = [[Person new] autorelease];
objc_autoreleasePoolPop(atautoreleasepoolobj);



void *objc_autoreleasePoolPush(void) {
    return..]]></description><category></category></item><item><title><![CDATA[iOS hook +load方法(A4LoadMeasure)]]></title><link>https://blog.youkuaiyun.com/littleFish_ZYY/article/details/119786321</link><guid>https://blog.youkuaiyun.com/littleFish_ZYY/article/details/119786321</guid><author>littleFish_ZYY</author><pubDate>Wed, 25 Aug 2021 18:44:47 +0800</pubDate><description><![CDATA[参考
hook +load 方法的前提要是在它被调用之前处理.
我们知道 +load 方法是在 dyld 加载完动态库后, 调用_objc_init

]]></description><category></category></item><item><title><![CDATA[iOS 类结构体 (导图)]]></title><link>https://blog.youkuaiyun.com/littleFish_ZYY/article/details/119759459</link><guid>https://blog.youkuaiyun.com/littleFish_ZYY/article/details/119759459</guid><author>littleFish_ZYY</author><pubDate>Tue, 17 Aug 2021 17:22:59 +0800</pubDate><description><![CDATA[画了张图



网图



]]></description><category></category></item><item><title><![CDATA[几种常见的锁&信号量&栅栏函数]]></title><link>https://blog.youkuaiyun.com/littleFish_ZYY/article/details/119679312</link><guid>https://blog.youkuaiyun.com/littleFish_ZYY/article/details/119679312</guid><author>littleFish_ZYY</author><pubDate>Fri, 13 Aug 2021 18:53:10 +0800</pubDate><description><![CDATA[多线程

1. 信号量: 类似于锁的作用

// 创建信号量

dispatch_semaphore_create(longvalue);

// 信号量+1

dispatch_semaphore_signal(dispatch_semaphore_tdeem);

// 信号量==0 ? 等待: 信号量-1并继续执行

dispatch_semaphore_wait(dispatch_semaphore_tdsema,dispatch_time_ttimeout);

业务场景: 异步转同步; 任务..]]></description><category></category></item><item><title><![CDATA[iOS GNUstep源码分析之 KVO]]></title><link>https://blog.youkuaiyun.com/littleFish_ZYY/article/details/119643973</link><guid>https://blog.youkuaiyun.com/littleFish_ZYY/article/details/119643973</guid><author>littleFish_ZYY</author><pubDate>Thu, 12 Aug 2021 18:30:35 +0800</pubDate><description><![CDATA[思维导图:

两个主要方法:
// 添加观察者, 监听本函数调用者的成员变量aPath的改变
- (void) addObserver: (NSObject*)anObserver
	  forKeyPath: (NSString*)aPath
	     options: (NSKeyValueObservingOptions)options
	     context: (void*)aContext;

// 接收 keyPath 值修改的通知
- (void)observeValueForKeyPa]]></description><category></category></item><item><title><![CDATA[iOS 源码分析之 _objc_msgSend(思维导图)]]></title><link>https://blog.youkuaiyun.com/littleFish_ZYY/article/details/119251452</link><guid>https://blog.youkuaiyun.com/littleFish_ZYY/article/details/119251452</guid><author>littleFish_ZYY</author><pubDate>Mon, 09 Aug 2021 17:31:06 +0800</pubDate><description><![CDATA[+ (void)initialize 懒加载调用.

当首次创建某个类的实例对象时, 会层层调用

1. Class class_initialize(Class cls, id obj)

2. static Class initializeAndMaybeRelock(Class cls, id inst,

                   mutex_t&amp; lock, bool leaveLocked)

3.void initializeNon...]]></description><category></category></item><item><title><![CDATA[flutter 单线程异步 及 isolate 使用过程遇到的问题]]></title><link>https://blog.youkuaiyun.com/littleFish_ZYY/article/details/118940331</link><guid>https://blog.youkuaiyun.com/littleFish_ZYY/article/details/118940331</guid><author>littleFish_ZYY</author><pubDate>Tue, 20 Jul 2021 18:32:30 +0800</pubDate><description><![CDATA[基本信息: Dart 是单线程模型.
线程内部维护一个loop. loop包括两个队列, 队列里就是Future任务:

microask queue
event queue
且前者执行优先级高于后者, 如图




我们平时写的代码就运行在flutter创建好的UI线程.  当运行耗时代码时页面会有卡顿感, 就是掉帧了.
解决方案: 开辟新线程处理耗时操作, 把处理结果传给 UI 线程刷新页面.
Dart 开辟新线程的方式是使用 isolate.
isolate 与普通线程的区别在于: isolate之.]]></description><category></category></item><item><title><![CDATA[iOS 允许http请求 关于NSAppTransportSecurity 和 NSExceptionDomains 的关系]]></title><link>https://blog.youkuaiyun.com/littleFish_ZYY/article/details/118813530</link><guid>https://blog.youkuaiyun.com/littleFish_ZYY/article/details/118813530</guid><author>littleFish_ZYY</author><pubDate>Fri, 16 Jul 2021 18:02:54 +0800</pubDate><description><![CDATA[当项目设置了 NSExceptionDomains, 不管 NSAllowsArbitraryLoads 是 true/false, NSExceptionDomains 下面 NSExceptionAllowsInsecureHTTPLoads 的值决定了是否允许 http 请求

以阿里云的域名为例, 访问http://aliyuncs.com

以下两种情况允许 http 请求

允许个别域名 http 请求:
(1) NSAllowsArbitraryLoads: false,
(2) NSExce]]></description><category></category></item><item><title><![CDATA[flutter swiper插件报错: ScrollController not attached to any scroll views]]></title><link>https://blog.youkuaiyun.com/littleFish_ZYY/article/details/116459985</link><guid>https://blog.youkuaiyun.com/littleFish_ZYY/article/details/116459985</guid><author>littleFish_ZYY</author><pubDate>Thu, 06 May 2021 18:23:59 +0800</pubDate><description><![CDATA[key: UniqueKey()



Swiper(
        key: UniqueKey(), //添加key
        autoplay: true,
        loop: (widget.datas.length &gt; 1) ? true : false,
        physics: const PageScrollPhysics(parent: const BouncingScrollPhysics()),
        itemBuilder: (BuildC..]]></description><category></category></item><item><title><![CDATA[pod install 超时, 卡住某个库]]></title><link>https://blog.youkuaiyun.com/littleFish_ZYY/article/details/115009421</link><guid>https://blog.youkuaiyun.com/littleFish_ZYY/article/details/115009421</guid><author>littleFish_ZYY</author><pubDate>Fri, 19 Mar 2021 16:32:00 +0800</pubDate><description><![CDATA[Error installing FMDB

[!] /usr/local/bin/git clone https://github.com/ccgus/fmdb.git /var/folders/9t/2p60ltxs0zx3bhgp2cy935dr0000gn/T/d20210319-33593-r7vcb5 --template= --single-branch --depth 1 --branch 2.7.5



Cloning into '/var/folders/9t/2p60ltx...]]></description><category></category></item><item><title><![CDATA[flutter 通过GlobalKey在自定义Widget外部获取其state刷新页面]]></title><link>https://blog.youkuaiyun.com/littleFish_ZYY/article/details/112624218</link><guid>https://blog.youkuaiyun.com/littleFish_ZYY/article/details/112624218</guid><author>littleFish_ZYY</author><pubDate>Thu, 14 Jan 2021 18:05:02 +0800</pubDate><description><![CDATA[PageA的定义如下

class PageA extends StatefulWidget {
  PageA({Key key}) : super(key: key);

  @override
  PageAState createState() {
    return PageAState();
  }
}

class PageAState extends State&lt;PageA&gt; {
  static GlobalKey homeKey = GlobalKey();
  ///获.]]></description><category></category></item><item><title><![CDATA[flutter push新页面A, 并且该页面关闭时返回的是首页]]></title><link>https://blog.youkuaiyun.com/littleFish_ZYY/article/details/112616036</link><guid>https://blog.youkuaiyun.com/littleFish_ZYY/article/details/112616036</guid><author>littleFish_ZYY</author><pubDate>Thu, 14 Jan 2021 16:11:49 +0800</pubDate><description><![CDATA[var router = MaterialPageRoute(
        builder: (context) =&gt;
            APage();
///跳转A页 &amp;&amp; 移除导航栈里除了首页的路由
Navigator.pushAndRemoveUntil(context, router, (route) {     
    return route.isFirst; ///导航栈的第一个: 首页
});


...]]></description><category></category></item><item><title><![CDATA[flutter pop回首页, 不管导航栈有多少路由]]></title><link>https://blog.youkuaiyun.com/littleFish_ZYY/article/details/112615622</link><guid>https://blog.youkuaiyun.com/littleFish_ZYY/article/details/112615622</guid><author>littleFish_ZYY</author><pubDate>Thu, 14 Jan 2021 16:08:21 +0800</pubDate><description><![CDATA[Navigator.popUntil(context, (route) {
    return route.isFirst;
});




]]></description><category></category></item><item><title><![CDATA[flutter setState解析 & frameWork层和engine层的交互]]></title><link>https://blog.youkuaiyun.com/littleFish_ZYY/article/details/109819770</link><guid>https://blog.youkuaiyun.com/littleFish_ZYY/article/details/109819770</guid><author>littleFish_ZYY</author><pubDate>Fri, 20 Nov 2020 18:49:50 +0800</pubDate><description><![CDATA[有状态的widget(StatefulWidget) UI刷新要调用setState.
自定义的StatefulWidget要重写setState方法.
那么setState内部做了什么处理, 刷新流程是怎样的呢?
@protected
  void setState(VoidCallback fn) {
    ...    
    _element.markNeedsBuild(); 
  }

void markNeedsBuild() {
    ...
    if (dirty)
      ]]></description><category></category></item><item><title><![CDATA[flutter Dart Mixin后关于调用super的理解]]></title><link>https://blog.youkuaiyun.com/littleFish_ZYY/article/details/109725994</link><guid>https://blog.youkuaiyun.com/littleFish_ZYY/article/details/109725994</guid><author>littleFish_ZYY</author><pubDate>Tue, 17 Nov 2020 10:52:15 +0800</pubDate><description><![CDATA[上代码
abstract class BaseClass {
  funcPrint() {
    print("BaseClass\n");
  }
}

mixin AClass on BaseClass {
  funcPrint() {
    print("AClass\n");
    super.funcPrint();
  }
}

mixin BClass on BaseClass {
  funcPrint() {
    print("BClass\n");
    super.fu]]></description><category></category></item><item><title><![CDATA[flutter-关于更新flutter本地库 flutter upgrade 和  flutter channel]]></title><link>https://blog.youkuaiyun.com/littleFish_ZYY/article/details/109293721</link><guid>https://blog.youkuaiyun.com/littleFish_ZYY/article/details/109293721</guid><author>littleFish_ZYY</author><pubDate>Mon, 26 Oct 2020 17:18:29 +0800</pubDate><description><![CDATA[今天发现一个问题:
同事的电脑命令行输入:flutter upgrade flutter本地库版本升级到了v1.22
我的电脑输入: flutter upgrade  flutter本地库版本升级到了v1.24
竟然没有升级到相同的版本…
后来发现是因为我俩的flutter channel不在同一个分支上,  我在dev分支, 他在stable分支.
切换到同一个分之后再敲命令flutter upgrade 就会更新到相同的flutter 版本了



...]]></description><category></category></item></channel></rss>