Memory leak when programmatically changing 'source' prop of Image
まだ誰も着手していません。
- 主要言語
- C++
- スター
- 127k
- フォーク
- 25.3k
- 平均マージ
- 1日 23時間
- マージ済み PR(30日)
- 4
説明
Description
If you use an Image component in render and use the parent component's state to manage the source prop, each time the source is changed the previous source is not deallocated. Even when the parent component is unmounted, the previous images still use memory.
Reproduction
I've made a simple ImageTest project that demonstrates the bug. (IMPORTANT: run app in release mode to experience the issue)
Code:
/**
* Sample React Native App
* https://github.com/facebook/react-native
* @flow
*/
import React, { Component } from 'react';
import {
AppRegistry,
StyleSheet,
Text,
View,
Image,
TouchableHighlight,
Dimensions,
} from 'react-native';
import image0 from './images/0.png'
import image1 from './images/1.png'
import image2 from './images/2.png'
import image3 from './images/3.png'
import image4 from './images/4.png'
const images = [
image0,
image1,
image2,
image3,
image4,
]
export default class ImageTest extends Component {
constructor() {
super()
this.state = ({
counter: 0,
})
}
increment = () => {
this.setState({
counter: this.state.counter + 1
})
}
render() {
const imageSource = images[this.state.counter]
return (
<View>
<Image
source={imageSource}
style={styles.image}
/>
<TouchableHighlight onPress={this.increment} style={styles.highlight}>
<Text style={styles.text}>NEXT IMAGE</Text>
</TouchableHighlight>
</View>
);
}
}
const window = Dimensions.get('window')
const styles = StyleSheet.create({
highlight: {
backgroundColor: 'yellow',
position: 'absolute',
bottom: 0,
left: 0,
},
text: {
fontSize: 50,
},
image: {
width: window.width,
height: window.height,
},
});
AppRegistry.registerComponent('ImageTest', () => ImageTest);
Solution
Presumably when the source is changed the underlying UIImage/UIImageView needs to be destroyed.
Additional Information
- React Native version: 0.41.0
- Platform: iOS
- Operating System: MacOS 10.12.3 / xcode 8.2
コントリビューションガイド
はじめの一歩
- issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
- 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
- リポジトリをフォークし、ブランチを切って変更します。
- issue 番号を参照したプルリクエストを送ります。
調査の方向性
リンクされた ImageTest の再現手順から始め、iOS release mode で実行し、メモリを監視しながら Image component の source prop を変更します。Image component による source の変更の native iOS 処理を追跡します。変更後および parent component のアンマウント後に以前の画像が解放されれば完了です。
索引モデルが issue の本文から書いたものです。
評価
- 技術スタック
- ios, react-native
- 領域
- mobile
- issue の種類
- バグ
- 難易度
- 4/5
- 見積もり時間
- 3〜5日
- 活発さ
- 停滞
- 明瞭さ
- おおむね明確
- 初心者へのやさしさ
- 35/100