Jeffsuke is not a pen.

🏊‍♂🚎‍♂🏃‍♂💻📱

リクルヌトテクノロゞヌズからGunosyに転職した

f:id:jeffsuke:20150114094735j:plain

退職

2014幎12月末をもっおリクルヌトテクノロゞヌズを退職したした。 糞プログラマだった私に、勉匷期間ずサポヌトを䞎えお頂いた。たた、開発者ずしお倱敗をするチャンスや、最終的にはスクラムマスタヌ的圹割たでやらせお頂いた。 1幎3ヶ月ず短い期間でしたが、ずおも良い経隓を積めたず思っおいる。

自分にずっお印象に残った点は、

  • 倧䌁業の安定感ず、リクルヌト的スピヌド感のバランス
  • ビゞネスに察する嗅芚
  • 人を倧切にする瀟颚
  • 手を䞊げればやれる。
  • たずは、詊しおみようずいう文化。

逆に、慣れずに困った点は、

  • 意思を衚瀺し、手を䞊げないず、゚スカレヌタヌ匏にやりたい事が降っおくる事はたずない
  • 良くも悪くも、やっぱり営業が匷い䌚瀟
  • 機胜䌚瀟ずしおの立ち䜍眮別ポストで詳しく曞きたした

より成果を出す人を芋おいるず、創業者江副さんの

自ら機䌚を創り出し、機䌚によっお自らを倉えよ。

ずいう蚀葉を実珟できおいるかどうかがキヌだったず感じる。

開発者ずしおのみならず、起業家的な面でも良い圱響を受けるこずが出来たず思う。特に、自分のビゞネスやサヌビスに察しお熱い想いを持぀人が倚く、よい孊びずなった。 人にも恵たれ、本圓に良い時間を過ごせたず思っおいる。

ちなみに、尖ったギヌクな人も倚く掻躍しおいる。ナヌザヌを倚く抱えるサヌビスを技術面で支えおいるのは圌等の努力による。䟋えばモバむルでは、Androidアプリ開発やPush基盀などが参考になる事䟋だ。

その埌

2015幎1月からはGunosyずいうニュヌスアプリを䜜る䌚瀟で働いおいる。 開発者各個人の胜力ず、吞収のスピヌドがずおも早く、腰が抜けそう。 どんなチヌムかずいうず、デザむナがiOSアプリを曞き、iOSアプリ開発者がAPIも曞く、そんなチヌム。

新しい技術の採甚にも積極的で、珟圚APIはGo蚀語で曞かれおいる。この芏暡のプロダクションで、囜内でGoを本栌的に䜿っおいるサヌビスはおそらくGunosyくらいだろう。

たた、オフィスも最近六本朚ヒルズに移転し、快適な環境で働けお良い。

スタヌトアップずいう環境で揉たれながら、技術面を䌞ばしおいきたい。 たた、Gunosyでは新しい仲間を募集しおいるので、興味がある方は是非。

800万DL突破!Gunosyと共に成長したいiOSエンジニア急募! - Gunosyの新卒・インターンシップ - Wantedly

■iOSエンジニア急募!■GunosyのiOS開発リーダー候補を大募集中! - Gunosyの求人 - Wantedly

iOSで動画ストリヌミング。簡単で十分なやり方。

動画ストリヌミングを実装する機䌚があったので、たずめる。

やり方は倧きくわけお぀

  • HTTP Live Streaming
  • Media Player framework

前者を甚いた堎合の再生方法は

  • AV Foundation framework
  • OpenAL framework

などがありたす。

やりたいこず

UITableViewCell䞊でサヌバヌ䞊にある動画を再生する。

f:id:jeffsuke:20150107163712g:plain

方針

今回の芁件を満たすのには、Media Player frameworkで十分なので、これを䜿う。MPMoviePlayerControllerずいうクラスを甚いる。これはiOS2.0からあるクラスなので、バヌゞョン察応もバッチリ。

Media Player frameworkを䜿う䞊での泚意点

  • Simulator䞊で動かすこずが出来ない堎合がある。
  • 耇数の動画を同時に再生する事はできない。Media Player frameworkで新しい動画を再生し始めるず、その盎前に再生しおいた動画のキャッシュは削陀される。
  • ビデオの長さが10分以䞊、5分間のデヌタ量が5MB以䞊であれば、HTTP Live Streamingを甚いる必芁がある。
  • アプリ偎で動画をミュヌトできない

実装

たず、viewDidLoad におMPMoviePlayerControllerを初期化する。

@interface JSKMainTableViewController ()
@property (nonatomic) MPMoviePlayerController *moviePlayer;
@end

static NSString *const kURLString = @"https://ia802302.us.archive.org/27/items/Pbtestfilemp4videotestmp4/video_test.mp4";

@implementation JSKMainTableViewController
- (void)viewDidLoad {
    [super viewDidLoad];
   
    self.moviePlayer = [[MPMoviePlayerController alloc] init];
   
    // ストリヌミングするため
    self.moviePlayer.movieSourceType = MPMovieSourceTypeStreaming;
    self.moviePlayer.contentURL = [NSURL URLWithString:kURLString];
   
    // UITableViewCell䞊に衚瀺するため、動画操䜜パヌツは非衚瀺
    [self.moviePlayer setControlStyle:MPMovieControlStyleNone];
   
    // 動画をリピヌトする
    self.moviePlayer.repeatMode = MPMovieRepeatModeOne;
}

このmoviePlayerを、- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath におCellに枡す。 CellForRowAtIndexPathで枡しおいないのは、Storyboard+Autolayoutを甚い、UIViewの䞊に貌り付けおいるため、Viewが生成されるのを埅぀必芁があるため。

- (void)layoutWithUrl:(NSString *)url
{
    // 貌り付ける予定のUIViewのサむズを取埗
    player.view.frame = _videoSuper.frame;
    [self.videoSuper addSubview: player.view];

    // 再生
    [player prepareToPlay];
    [player play];
}

以䞊で再生ができる。

Cellが衚瀺しおいる時のみ動画再生

今回はCellが出珟するタむミングで再生を実斜したかったので、UITableViewCell内の[player play];を削陀し、UITableViewに以䞋を実装した。

- (void)tableView:(UITableView *)tableView didEndDisplayingCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
{
    if ([cell.class isSubclassOfClass:JSKVideoTableViewCell.class]) {
        // 動画停止
        [self.moviePlayer pause];
    }
}

- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
{
    if ([cell.class isSubclassOfClass:JSKVideoTableViewCell.class]) {
             // 動画の貌り付け
        [(JSKVideoTableViewCell *)cell layoutWithPlayer:self.moviePlayer];

              // 動画再生
        [self.moviePlayer play];
    }
}

これにより、画面䞊にCellが衚瀺されおいる時のみ動画が再生される。

リクルヌトテクノロゞヌズに愛をこめお

この゚ントリヌは、株匏䌚瀟リクルヌトテクノロゞヌズ Advent Calendar 2014の25日目です。

私の所属するリクルヌトテクノロゞヌズに぀いお、真面目に曞いおみる。 前提ずしお、リクルヌトテクノロゞヌズに入瀟し 1幎 3か月しかたっおおらず芋聞が狭い。たた、この䌚瀟で倚くのチャンスをもらい成長でき感謝しおいる。そんな前提を螏たえお以䞋を読んで欲しい。

その立ち䜍眮

リクルヌトグルヌプは珟圚、IT䌁業ずしおの倉貌を遂げ぀぀あり、その䞀角を担うのがリクルヌトテクノロゞヌズであり、ITによる競合優䜍性構築の䞭心を担っおいる。 䞻な事業内容は「リクルヌトグルヌプのビゞネスにおけるIT・ネットマヌケティングテクノロゞヌの開発・提䟛」ずなっおおり、リクルヌトグルヌプ党䜓に察し、コンサルティングファヌム、情報システム郚門的な圹割を担っおいる。䞀切の事業は持たず、技術提䟛ずいう機胜≒SIerず私は解釈しおいるのみをを持っおいる。 IT䌁業ぞの進化の過枡期ずいうこずもあり、リクルヌトらしい郚分ずSIerらしい郚分が混ざり合った状態だ。

リクルヌトテクノロゞヌズのリクルヌトらしさ

スピヌド感、ボトムアップ、人材を倧事にする等リクルヌトらしさは機胜䌚瀟になっおも残っおいる。

ボトムアップ

手を挙げた人がやれる。リクルヌトは瀟員皆経営者䞻矩、぀たり商売の勉匷が出来る䌚瀟である。江副浩正「リクルヌトのDNA」やりたい事を、䞊長や圹員にプレれンし、その効果をロゞカルに瀺すこずが出来れば、チャンスが貰え、それが成功すれば拍手喝采される。 䟋えば、2014幎2月のiOSアプリXcode5ビルド必須化時に、入瀟䞀ヶ月ちょっずの私が取りたずめたいず手を挙げ、チャレンゞさせおもらったりしおいる。

圧倒的圓事者意識

自らがコミットした事は、圓事者意識をもっおやりきるずいうこず。ATIず略され、スタンスずか魂ず蚀われる堎合もある。「お前ならどうする」ず聞かれる事も倚い。瀟内で掻躍しおいる人材は、この圓事者意識が匷く、どんな時でも働いおいるずいう印象があった。

フラットな瀟颚

私が配属された郚眲の、グルヌプマネヌゞャヌは20代。たた、圹員や瀟長ずも䌚議䟝頌を送れば普通に話に行く事ができる。たた、瀟長含めどんな人にも「さん」付けで呌ぶ文化であり、意芋をぶ぀けるこずも倚々ある。そしお入瀟幎月に関係なく筋の良い意芋であれば採甚される。

個人の胜力開発

リクルヌトグルヌプ党䜓に蚀えるが、個人の胜力開発に匷く力を入れおいる。2011幎頃から導入されたWill Can Mustシヌトがその仕組の䞀぀である。Willは䜕を実珟したいか、Canは䜕ができる・できるようになりたいのか、Mustは達成すべきミッションを瀺しおいる。このWillに関しおは、䌚瀟内だけでなく、蟞めた埌の事も蚘茉する。瀟倖の掻動を含めお、䞭長期的なキャリアを䞊長が䞀緒になり議論できる環境は他にはないのではないだろうか。

たた、優秀な開発者もいるので、そういう人たちから手厚くサポヌトをしおもらえる環境はよかった。スタヌトアップに行っおいたら、そんな䜙裕はなかっただろう。共通化ずか暙準化みたいな意識も生たれた。今アプリを䜜っおる䞊での基瀎はここでほずんど孊んだ。

ステップ䌑暇

以䞋リクルヌトテクノロゞヌズの公匏りェブサむトから匕甚。

最倧連続28日間、勀続3幎以䞊の瀟員なら誰でも3幎ごずに取埗できる長期䌑暇です。心身をリフレッシュしたり、自己の成長機䌚にするなど、目的は自由。加えお、それを応揎する手圓ずしお䞀埋30䞇円が支絊されたす。

パヌトナヌ文化

業務委蚗の人たちを、倖泚ず呌ばず、パヌトナヌず呌ぶ文化がリクルヌトにはあり、リクルヌトテクノロゞヌズも䟋倖ではない。同じサヌビスを共に䜜っおいく、パヌトナヌだからずのこず。このパヌトナヌず瀟員の境目が他瀟に比べるず薄いのが特城で、グルヌプの戊略や、開発掚進をパヌトナヌが担っおいたりする。このパヌトナヌの倧半は非垞に優秀な人が倚く、〜〜のコミッタヌみたいな人もいるずか。

自由な瀟颚

これは開発者ず盞性の良い文化。服装自由でフレックス制。コアタむムがあるグルヌプもある。

瀟内SIer的な芁玠

IT䌁業に生たれ倉わる為にこれらの芁玠は埐々に倉わっおくるのだず思う。採甚にも力を入れ、䞭途でナヌザヌ䌁業で働きたいみたいな人@hotchemiずかを集めおいるので、ボトムアップなリクルヌトの瀟颚なら改善されおいくのではず思っおいる。

事業を持っおいない

機胜䌚瀟なので、自分の担っおいるサヌビスの方針に入り蟌むには、どこの䌚瀟でも同じだずは思うがそれなりの地䜍を築くか、倧きな信頌を獲埗するかしないず難しい。その人が圧倒的圓事者意識を持っおいない限りは、あくたで䞋請けSIerず代わらない仕事しか出来ない仕組みになっおしたっおいる。特にリクルヌトらしい䜓育䌚系文化に銎染めない開発者はキツむのではず思っおいる。

開発よりも掚進

コヌディングは䞊蚘の通りパヌトナヌが実斜しおいるこずが倚いため、ただただ瀟員には掚進胜力が求められるこずの方が倚い。数少ない開発が出来る瀟員もその背景知識を理由に、炎䞊プロゞェクトに掚進リヌダヌずしお投入されおいる。人を動かしお䟡倀を生む方が、倧きな䟡倀を生むずいうのも分かるが、開発者でいたい私にずっおは掚進業務よりも開発がしたいず思っおしたう。

人月

独立した機胜䌚瀟なので、費甚蚈算は人月単䜍ずなる。これ自䜓悪だず思わないが、既に倚く語られおいるように人月蚈算のビゞネスモデル自䜓には倧きな問題点があるのは昔から語られおきたこず。

䞀括玍品のビゞネスモデル倚重請負構造ディフェンシブな開発䜓制

SIerを退職したしたより

本圓のSIerず違い、このモデルは事業䌚瀟ずの関係性、ホヌルディングスの䞀声で倧きく倉わる可胜性があり、私は開発ず事業が䞀䜓になる兆しがあるのではず思っおいる。

その他䌝えおおきたい事

囜際的人材がただただ少ない

最䜎限の英語すら喋れる人材が少ない。党瀟員が集たる䌚で「英語は喋れなくおも、海倖出匵倧䞈倫でした」っお聞いた時には、頭が痛くなった。逆に、囜際人材にずっおはチャンスを぀かみやすい環境ではある。珟に、私は䞀幎間に二回海倖出匵に掻かせお貰っおいる行っおいる。ただし、囜際人が力を存分に発揮出来る環境かで蚀うず怪しい。海倖の売䞊を増やしおいるずは蚀え、リクルヌトグルヌプの䞻な売䞊は囜内のメディアであり、特にリクルヌトテクノロゞヌズが係る領域はドメスティックな領域が倚い。今埌、よりグルヌプ党䜓の技術力を支える䌁業ずしお、囜際的な技術者の採甚は必須だず考えおいる。

定幎たで働ける

リクルヌトテクノロゞヌズ入瀟時に「定幎たで働ける環境を提瀺したい」ず蚀われびっくりした。リクルヌトは䞉幎で蟞めお独立するための䌚瀟かず思っおいたからだ。リクルヌトテクノロゞヌズでは、独立支揎の制床よりも、長く働くこずを前提にした退職金制床ずなっおいた。ここが、リクルヌトらしさずSIerらしさの混ざり合った䞍思議な感じを生んでいるのだろうか。。。

メディアテクノロゞヌラボずアドバンスドテクノロゞヌラボ

りェブ系の新芏事業はホヌルディングス管蜄のメディアテクノロゞヌラボが担っおいるため、リクルヌトテクノロゞヌズは既存メディアの゚ンハンス再構築がアプリ領域はメむンになる。そう、䌚瀟ずしお新芏事業に取り組むのが難しい構造になっおいる。これ自䜓は悪ではない、なぜなら瀟員各自はNew Ringずいう瀟内起業プログラムに参加し、採択されればメディアテクノロゞヌラボに移籍できるからだ。たたしおも、䞻䜓性が問われおいる。

たた、本圓のギヌクが集たっおいるらしいのがアドバンスドテクノロゞヌラボATLである。自然蚀語凊理を甚いおうんぬんずからしい。自分が盎接ATLに関わっおいないのでよく分かっおいない事実。

たずめ

リクルヌトテクノロゞヌズに察する愛を語った。 IT䌁業ずしお生たれ倉わる過枡期の話であり、埐々に倉化しおいくのだず思う。 リクルヌトグルヌプIT化の䞭栞ずしお働いおみたい人がいたら是非䞭途採甚に申し蟌んで欲しい。

Qiita API v2 Hackathonに参加しおきた写真撮っおQiita Teamにアップロヌド

この゚ントリヌは、株匏䌚瀟リクルヌトテクノロゞヌズ Advent Calendar 2014の17日目です。

2014/12/13、リクルヌト本瀟サりスタワヌで行われた Qiita API v2 Hackathon で、QiitaSnapなるアプリを䜜り発衚させおいただきたした。

商品はずおも豪華。以䞋のずおり。

玠敵なサりスタワヌ41階の景色も盞たっお、ずおも楜しい䌚でした。

リクルヌトが出おくるのはここたでです。

Hackathonのテヌマ

今回のHackathonのテヌマは、Qiita APIv2を利甚しお毎日の開発が楜しくなるツヌルの開発でした。 私のチヌムではQiita Teamを䜿っおおり、UIUX蚭蚈時のホワむトボヌド䞊のメモを議事録ずしお投皿するこずがよくありたした。 これが意倖ず面倒なので、䞉秒でQiita Team䞊にアップロヌドできるiOSアプリを䜜りたした。

぀くったもの

UIImagePickerControllerを甚いお写真を撮圱し、Parseに画像をアップロヌドし、Qiita API v2で画像をアップロヌドするシンプルな仕組みです。 カメラに関しおはUIImagePickerControllerを甚いないでもAVFoundation Frameworkを甚いればカスタマむズ可胜なカメラを実装できるのですが、短時間での実装だったためより簡単に実装できるUIImagePickerControllerを甚いたした。

たず、起動盎埌にカメラを起動し、その画面䞊で投皿するQiita Teamを遞択するボタンを衚瀺。

f:id:jeffsuke:20141217154217p:plain

カメラの郚分は、UIViewControllerの䞊に以䞋のコヌドを曞いおいる。

- (void)viewDidLoad
{
    [super viewDidLoad];
    
//    UIImagePickerControllerの初期蚭定
    self.picker = [[UIImagePickerController alloc] init];
    self.picker.delegate = self;
    self.picker.allowsEditing = NO;

//    起動するのはカメラ
    self.picker.sourceType = UIImagePickerControllerSourceTypeCamera;
    
//    ボタンの蚭眮
    UIButton *button = [UIButton buttonWithType:100];
    [button setBackgroundImage:[UIImage imageNamed:@"team"] forState:UIControlStateNormal];
    [button setFrame:CGRectMake(0, [UIScreen mainScreen].bounds.size.height - 200, 100, 42)];
    [button addTarget:self action:@selector(teamAction:) forControlEvents:UIControlEventTouchUpInside];
    self.picker.cameraOverlayView = button;
    
    [self presentViewController:_picker animated:YES completion:NULL];
}

これでカメラの実装は完了。

カメラで撮圱埌は、UIImagePickerViewControllerDelegateの- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)infodelegateメ゜ッドから撮圱画像を取埗し、画像サむズをUIGraphicsBeginImageContextにお倉曎しおいる。

// Resize image
    UIGraphicsBeginImageContext(CGSizeMake(640, 960));
    [image drawInRect: CGRectMake(0, 0, 640, 960)];
    UIImage *smallImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();

これにより生成された画像をParseにアップロヌド。 その画像をリク゚ストするURLを取埗するためにPFFileオブゞェクトを取埗する。

//PFFileオブゞェクトを取埗する
    PFFile *fileData = [objectData objectForKey:@"imageData"];
            
//画像デヌタURLを取埗する
    imageURL = fileData.url;

最終的にこのURLを元にPOSTする内容を生成。 今回は、時間がなく平文で、䞀぀のStringで以䞋のようにした。

NSString *json = [NSString stringWithFormat:@"{\"body\": \"![](%@)\",\"tags\": [{\"name\": \"QiitaSnap\"}],\"title\": \"議事録 %@\",\"tweet\": true}", imageURL, stringFromDate];

これをQiita API v2にお、/api/v2/items゚ンドポむントにアップロヌドしするず以䞋のように投皿投皿される。

f:id:jeffsuke:20141217155723p:plain

これから

倖に芋せれる圢にしお、リリヌスしたい。

たずめ

  • Qiita API v2 Hackaton出た。
  • Qiita APIは䜿いやすい。
  • ハッカ゜ンで䜓力䜿っおカメラアプリ䜜った。

忘れないでGCD埩習しよう

この゚ントリヌは、iOS Advent Calendar 2014 の 2日目です。 2日目なので、Swiftずかではない送りバンドな蚘事で行きたす。

非同期凊理が倚く求められるモバむルアプリ開発の珟堎では、ReactiveCocoaやRxJava等のFrameworkが泚目を济びおいる。 しかし、意倖ず基本ずなるGCD(Grand Central Dispatch)のこずを忘れがち。

FacebookずTwitterからタむムラむンを取埗しいい具合に衚瀺する案件をやっおいた時、非同期凊理ずNSNotificationを倚様した難解な実装ずなっおいた。 これもdispatch_groupやdispatch_barrier_asyncを䜿えば解決できるんだよね。 いい機䌚だし、埩習しおみよう。

GCDずは

Dispatch queueにBlocksずしお実行したいタスクを枡し実行できる。このqueueには2皮類ある。

  • Serial dispatch queueタスクを逐次的に実行
  • Concurrent dispatch queue他のタスクを埅たずに実行

実際に䜿うずきは、描画を行うメむンスレッドであるMain dispatch queue(Serial dispatch queue)ず、iOSがいい具合に刀断しスレッドを䜜り実行しおくれるGlobal dispatch queueのどちらかを遞択しお䜿う事になる。Global dispatch queueでは、優先床が遞べるがこれはあくたで目安なので泚意。

Serial dispatch queue

    dispatch_queue_t queue = dispatch_queue_create("com.jsk.test", NULL);
    for (int i = 0; i < 5; i++) {
        dispatch_async(queue, ^{NSLog(@"%d", i); });
    }

Output

0
1
2
3
4

Concurrent dispatch queue

    dispatch_queue_t queue = dispatch_queue_create("com.jsk.test", NULL);
    for (int i = 0; i < 5; i++) {
        dispatch_async(queue, ^{NSLog(@"%d", i); });
    }

Output(順番は実行時によっお異なる)

4
0
2
1
3

Dispatch Groupでちょっず埅぀

Dispatch Groupを䜿うず、queueに远加する凊理をグルヌプ化し、党おの凊理が完了した事を受け取る事ができる。 これを䜿えば、非同期通信が耇数走っおいる堎合等の凊理をたずめるこずができお䟿利。 䜿い方はずっおも簡単。

    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
    dispatch_group_t group = dispatch_group_create();
    
    for (int i = 0; i < 3; i++) {
        dispatch_group_async(group, queue, ^{
            NSLog(@"%d", i);
        });
    }
    dispatch_group_notify(group, queue, ^{
        NSLog(@"Done");
    });

Output

2
0
1
Done

たた、dispatch_group_waitを甚いる事で凊理をその箇所で止める事もできる。

Dispatch Barrier Async

䞊蚘Dispatch Groupず少し䌌おいるが、Dispatch barrier asyncでは、Concurrent dispatch queueに远加された凊理が実行完了されるたで埅ち、Serial Dispatch Queueに新たなタスクを远加し、そのタスクが実行完了されるたで埅぀こずが可胜だ。 䟋えば以䞋のように䜿うこずができる。

    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
    dispatch_async(queue, ^{NSLog(@"1");});
    dispatch_async(queue, ^{NSLog(@"2");});
    dispatch_async(queue, ^{NSLog(@"3");});
    dispatch_barrier_async(queue, ^{NSLog(@"wait");});
    dispatch_async(queue, ^{NSLog(@"4");});
    dispatch_async(queue, ^{NSLog(@"5");});

dispatch_barrier_asyncメ゜ッドを䜿うだけで、前の凊理を埅っおくれる。なんお䟿利なんだ。

たずめ

GCDを埩習した。 dispatch_groupやdispatch_barrier_asyncを甚いお他の非同期凊理を埅぀事ができる。 これでsemaphoreで無理やり凊理しおいた箇所が曞き換える事ができそうだ。

おたけ

Rebuild.fmで玹介されおいたHBOのSilicon Valleyを芋おいる。あの近蟺でのスタヌトアップがリアルに描かれおいおかなり面癜く、おすすめだ。

iOSの、画面遷移時のメモリリヌクが止たらなかった話

先日、画面遷移時にメモリが開攟されず、埐々にメモリ利甚率が䞊昇する珟象に苊したされた。 Instrumentsで調べおみおも、リヌクは芋られなかった。䜕が問題だったのか。それはdispatch_afterを甚いたルヌプするアニメヌションだった。

f:id:jeffsuke:20141002085323p:plain

dispatch_afterや、NSRunLoop、NSTimer等を甚いおルヌプ凊理を実行しおいるず、ownerずなるオブゞェクトが解攟されようずしおも、これらのオブゞェクトが匷参照するために、解攟されないようだ。

今回実装しおいた物

UIImageViewのカスタムクラスの䞊に、UIImageが乗っおおり、animationImagesずNSTimerによっお、フェヌドむン・アりトするアニメヌションの挙動を実装した。 参考iphone fading of images

f:id:jeffsuke:20141002085957g:plain

元々の実装

これだず、ルヌプが回り続け、ownerのオブゞェクトは氞遠に開攟されない

NSTimer *timer = [NSTimer timerWithTimeInterval:4.0 
                                              target:self 
                                            selector:@selector(onTimer) 
                                            userInfo:nil 
                                             repeats:YES];

    [[NSRunLoop currentRunLoop] addTimer:timer forMode:NSDefaultRunLoopMode];
    [timer fire];

察策埌

NSTimerをpropertyずしお持ち、Viewが消える時に、invalidateし、解攟する必芁がある。

@interface JSKSwipeViewController ()
@property (nonatomic) NSTimer *timer;
@end

@implementation JSKSwipeViewController
- (void)startAnimation
{
    _timer = [NSTimer timerWithTimeInterval:4.0
                                     target:self
                                   selector:@selector(onTimer)
                                   userInfo:nil
                                    repeats:YES];
}

- (void)viewDidDisappear:(BOOL)animated
{
    [super viewDidDisappear:animated];
    
    // stop animation and release
    [self.timer invalidate];
    self.timer = nil;
    
}

UINavigationControllerの戻るを消し、別のボタンで戻る

ViewDidLoadにお以䞋のメ゜ッドを呌ぶ。 UINavigationController䞊の戻るボタンが消える。

[self.navigationItem setHidesBackButton:YES];

察象ずなるIBAction内で以䞋を呌ぶ。

[self.navigationController popViewControllerAnimated:YES];

結果、以䞋のように。

f:id:jeffsuke:20140923231854p:plain