【iOS】ld: library not found for -lPods


CocoaPodsが上手くビルドされなくて困り果てました。。。

以下の2つの方法を試したらなんとかビルドできるようになったので覚書

  1. Podsプロジェクトのビルドセッティングの項目にあるBuild Active Archtecture OnlyをNOにする。
  2. XcodeのメニューからProduct>Scheme>Manage Schemesを選択し、showとsharedのチェックボックスを全部埋める。

そんでもってクリーンビルドして、オーガナイザからDerivedDataを削除し、さらに/Users/【ユーザー名】/Library/Developer/Xcode/DerivedDataのフォルダを削除すればなおよしかもしれません。

※pod installを行う度に、Build Active Archtecture Onlyの項目はYESになるので注意しましょう。

参考

http://qiita.com/u651601f/items/de2cc28ea8fe36f48a70
http://stackoverflow.com/questions/19419781/cocoapods-arm64-issue

【iOS】下位バージョンのOSの為のコードの書き分け方


新しいバージョンのOSにしかないメソッドを呼び出す時、下位バージョンのOSにも対応するためのコードを書く必要が出てきたりしますよね。

しかし、古いAPIを呼び出そうとすると”deprecated”のワーニングが出てきてウザかったりします。

そんな時は”__IPHONE_OS_VERSION_MIN_REQUIRED”マクロを使うと良いでしょう。

-(CGSize)sizeOfMultiLineLabel{
    
    NSAssert(self, @"UILabel was nil");
    
    //Label text
    NSString *aLabelTextString = [self text];
    
    //Label font
    UIFont *aLabelFont = [self font];
    
    //Width of the Label
    CGFloat aLabelSizeWidth = self.frame.size.width;
    
#if __IPHONE_OS_VERSION_MIN_REQUIRED < __IPHONE_7_0
        return [aLabelTextString sizeWithFont:aLabelFont
                            constrainedToSize:CGSizeMake(aLabelSizeWidth, MAXFLOAT)
                                lineBreakMode:NSLineBreakByWordWrapping];
#else
        return [aLabelTextString boundingRectWithSize:CGSizeMake(aLabelSizeWidth, MAXFLOAT)
                                              options:NSStringDrawingUsesLineFragmentOrigin
                                           attributes:@{
                                                        NSFontAttributeName : aLabelFont
                                                        }
                                              context:nil].size;
#endif
    
    return [self bounds].size;
}

sizeWithFontメソッドはiOS7以上のAPIだとdeprecatedなのですが、見事にワーニングが出ませんね。

[iOS]アプリのアップデートをハンドリングする



アップデート時にplistのbundle versionを書き換えておけば、アプリケーションのバックグラウンド復帰時、もしくは起動時に自分のbundle versionを確認して、アップデートされているかどうか判断することができます。また、アプリケーションがアップデートされてもメモリはアプリケーションがアップロードされる前の状態を保っている(解放されない)ようです。

ちなみにitunesのAPIから自分のアプリの最新版の情報を取得して、現在のバージョンが最新版かどうか確認することができるようです。

参考:http://qiita.com/euapplication/items/8de2e49ee1d6530f16e7

[Objective-C]多重ループを抜ける



for文から脱出する時はbreakを使えばOKですね。ただ、これが多重ループとなると一番内側のループでbreakしてもさらに外側のループは周り続けてしまいます。

Objective-Cの場合は以下のような方法がいいかもしれません。(StackOverFlowより転載)

bool dobreak = false;
for ( ..; !dobreak && ..; .. ) {
   for ( ... ) {
      if (...) {
         dobreak = true;
         break;
      }
   }
}

他にも以下のような方法があり、さらに短い行数でループを抜けられるのですが推奨はされないようです。

for ( int i = 0; i <= max ; i++) {
   for ( ... ) {
      if (...) {
         i = max;
         break;
      }
   }
}

参考:http://stackoverflow.com/questions/863172/how-can-i-break-out-of-two-nested-for-loops-in-objective-c