Hatena::ブログ(Diary)

Over&Out その後 このページをアンテナに追加 RSSフィード Twitter

2012-02-26

オブジェクトが持つプロパティの型と名前のリストを取得する

クラス/オブジェクトが持つプロパティ情報を取得するには、Objective-C のランタイムにある、

objc_property_t *class_copyPropertyList(Class cls, unsigned int *outCount);

を使用します。


また objc_property_t 型のプロパティ情報からプロパティ名を取得するには、同じくobjcランタイム内の

const char *property_getName(objc_property_t property);

を使用します。


プロパティ名一覧を返すメソッドの実装例

まずランタイムのヘッダをインポート。

#import "objc/runtime.h"

こんな感じでプロパティ名一覧を返すメソッドを実装できます。

- (NSArray *)propertyNames {
    unsigned int outCount, i;
    objc_property_t *properties = class_copyPropertyList([self class], &outCount);
    NSMutableArray *arr = [NSMutableArray arrayWithCapacity:0];
    for(i = 0; i < outCount; i++) {
        objc_property_t property = properties[i];
        const char *propName = property_getName(property);
        if(propName) {
            NSString *propertyName = [NSString stringWithCString:propName];
            [arr addObject:propertyName];
        }
    }
    free(properties);
    
    return arr;
}

プロパティ名と型を返すメソッドの実装例

まず、objc_property_t 型のプロパティ情報から型名を取り出すメソッドを実装します。

こちらのページの2つ目の回答に載っているコードほぼそのまんまです。(1つ目の回答のコードだとエラーになる場合があります)

static const char * getPropertyType(objc_property_t property) {
    const char *attributes = property_getAttributes(property);
    char buffer[1 + strlen(attributes)];
    strcpy(buffer, attributes);
    char *state = buffer, *attribute;
    while ((attribute = strsep(&state, ",")) != NULL) {
        if (attribute[0] == 'T' && attribute[1] != '@') {
            return (const char *)[[NSData dataWithBytes:(attribute + 1) length:strlen(attribute) - 1] bytes];
        }        
        else if (attribute[0] == 'T' && attribute[1] == '@' && strlen(attribute) == 2) {
            return "id";
        }
        else if (attribute[0] == 'T' && attribute[1] == '@') {
            return (const char *)[[NSData dataWithBytes:(attribute + 3) length:strlen(attribute) - 4] bytes];
        }
    }
    return "";
}


で、下記のように、キーとしてプロパティ名、値として型名を持つ NSDictionary 型でプロパティ一覧を返すメソッドを実装できます。

- (NSDictionary *)properties {
    unsigned int outCount, i;
    objc_property_t *props = class_copyPropertyList([self class], &outCount);
    NSMutableDictionary *dic = [NSMutableDictionary dictionaryWithCapacity:0];
    for(i = 0; i < outCount; i++) {
        objc_property_t property = props[i];
        const char *propName = property_getName(property);
        if(propName) {
            const char *propType = getPropertyType(property);
            NSString *propertyName = [NSString stringWithCString:propName];
            NSString *propertyType = [NSString stringWithCString:propType];
            [dic setObject:propertyType forKey:propertyName];
        }
    }
    free(props);
    
    return dic;
}


2012-02-14

WWDC 2011 Session Videos の「あとで見る」リスト その1

ずっと見ようと思っていてなかなか見れてない WWDC の セッションビデオ。

とりあえず気になったものを列挙してみました。

数が多いのでまずは A〜I 編。


Advanced ScrollView Techniques

Come learn about how to achieve the appearance of infinite scrolling in either one or two dimensions. We'll also look at how to change the resolution of drawn content during zooming, without requiring the use of CATiledLayer.

よく知ってるつもりの ScrollView だからこそ、何か新しい発見があるかもしれないので。


Advanced Text Processing

Applications deal with large amounts of text in a wide variety of languages and formats. They can benefit from improving their understanding of textual data. Learn how to analyze the content of text using the wide range of features now available on iOS and Mac OS X, including regular expressions, data detectors, linguistic APIs, spellchecking, and more.

文字列処理の話。


Audio Session Management for iOS

iOS provides a powerful engine for playing, recording, and processing audio in your applications for iPhone, iPad or iPod touch. Gain a thorough understanding of audio session management, and learn the recommended practices for handling background audio, dealing with interruptions, and playing multiple sounds simultaneously.

オーディオの同時再生について興味あり。


Building iAd Rich Media Ads with iAd Producer

iAd Producer's drag-and-drop interface makes it easy to lay out, customize, and test highly interactive iAd rich media ads. Discover how built-in page templates and components make ad creation a snap for designers without sacrificing the code editing and debugging capabilities that sophisticated developers expect. You'll see how you can use iAd Producer to easily create complex ads, test your ad on your own iPhone or iPad, set breakpoints, step through code, and optimize performance.

iAd Producer の話。


Core Animation Essentials

Core Animation is the layer-based animation system at the heart of the dynamic user experience seen in iOS and Mac OS X. See Core Animation in action and explore its intuitive programming model for creating compelling animations. Understand how to maintain high frame rates and learn recommended practices to deliver smooth transitions and effects in your apps.

Core Animation の話。


Developer Tools Kickoff

Xcode is the development environment for creating great applications for Mac, iPhone, and iPad. Discover amazing new features in Xcode, and learn how to get the most out of your development experience. A must-attend session for all developers.

Xcode の新機能について。


Device Management and App Submission with Xcode 4

Xcode 4 contains a wide array of features to make developing for iOS easy and straightforward. From automatic device provisioning, to creating and resigning build archives, and validation and submission to the app store. Join the Xcode engineering team for a tour through the iOS development process and discover time-saving tips and tricks built right into Xcode.

オーガナイザからバイナリ送信する際にどんなチェックが行われているのかとか知りたいので。


Effective Debugging with Xcode 4

Xcode 4 introduces a refined and powerful new debugging interface. Discover how you can better track the value of your variables, better debug multithreaded applications, and find and fix issues faster than ever. Join the Xcode engineering team for an in-depth look at the Xcode debugger and LLDB.

Xcode 4 での効果的なデバッグ方法。


Essential Game Technologies for iOS, Pt 1

iOS delivers an incredible collection of graphics, media, and integrated technologies for developing cutting-edge mobile games. Explore the frameworks and technologies that enable you to create the most imaginative games possible. Dive into expert techniques to harness the full capabilities of iOS and create rich gameplay experiences for your players. This is the first of two sessions covering the techniques for iOS game development.

難しそうだけどゲームつくってる身なので目を通しておく。


Essential Game Technologies for iOS, Pt 2

iOS provides a phenomenal platform for mobile game development. Dive deeper into iOS game technologies and see how the best games take advantage of the rich features of the platform. Get practical guidance about game design and production, and see which iOS features can drive incredible advances in your titles. This is the second of two sessions covering the techniques for iOS game development.

同上。


Getting your Apps Ready for China and other Hot New Markets

Sales of Apple products are increasing dramatically in new markets such as China. Apple platforms now support new localizations such as Arabic. Quality localization is critical to the success of your apps in these rapidly growing markets. This session will cover the things you need to know to succeed, including:1. What kind of language support is offered and how you can test. 2. Making your application localizable for these markets. 3. How to make sure your application supports bidirectional UI.

中国とか新興マーケットに向けたローカライズの話に興味あり。


Graphics, Media, and Games Kickoff

iOS and Mac OS X deliver an amazing lineup of technologies for developing cutting-edge games, innovative graphical applications, and platform-optimized audio and video experiences. Join your fellow developers in kicking off the Graphics, Media, and Games sessions of WWDC 2011 and gain key insights into the powerful capabilities you'll use to create great apps.


iAd Implementation Best Practices

While adding iAd to your app is as easy as dropping a banner view in your UI, additional optimizations and a solid understanding of the iAd Network will ensure you're getting the most out of your implementation. See how standard advertising terms such as fill rate, impressions, and eCPM are defined from the iAd Network perspective, learn why these common metrics may vary for you, and discover best practices that can increase your advertising efficiency.

iAd のベストプラクティス。


iBooks: Create Beautiful Books with HTML5, CSS3 and EPUB

iBooks is an amazing way for anyone to create, sell and enjoy many types of books on iPhone and iPad. See how to leverage EPUB and the latest HTML and CSS technologies to create any type of book, from novels and technical manuals to cookbooks and children's books. Go beyond text and discover how to add supplementary content such as tables, PDFs, audio and video. Learn how to create precise picture books using your own custom layout and use CSS to enrich books with animation.


Implementing UIViewController Containment

View controllers are a fundamental piece of any iOS application. Come to this session to learn how to ensure child view controllers receive appearance and rotation callbacks correctly, new methods of controlling view controller presentation, and become acquainted with a new view controller container class.


Improving the Stability of Your Apps

Learn how to properly test and debug your application to ensure a great first impression. From edge cases to common pitfalls, learn tips and tricks on how to ensure that your application runs on multiple devices and multiple versions of iOS.


In-App Purchase for iOS and Mac OS X

In-App Purchase lets you embed a store directly within your app that can be used to sell a variety of items such as premium content, virtual goods or subscriptions. Discover the Store Kit APIs needed to add In App Purchase to your iOS or Mac OS X application. Understand how to perform receipt verification, and learn to manage and test items for sale through iTunes Connect. See how new features of iTunes Connect make it easier to manage large sets of items for sale, test subscriptions that automatically renew, and more.


Inside the Accelerate Framework for iOS

Introduction to the Accelerate framework APIs, which consists of state of the art signal processing, matrix and linear algebra computation and now image processing and array based elements.


Introducing App Sandbox

Discover how you can use Lion's App's Sandbox feature to protect your application's users from unintentional bugs or deliberate attempts to compromise security. Understand the App Sandbox security goals, how applications and user data are isolated from each other, and how to describe the system resources your application needs to get its work done.


Introducing Automatic Reference Counting

Automatic Reference Counting (ARC) dramatically simplifies memory management in Objective-C. Discover how the latest advancements in the LLVM compiler can help you write less code when creating safe, fast applications. A must-attend session for developers of all skill levels, on both Mac OS X and iOS.


iOS Accessibility

iOS devices are incredibly popular for users with blindness, low vision, and other disabilities. Learn how to make your apps accessible to everyone, as well as how to make apps that are tailored expressly for users with disabilities. This talk will cover new and existing UIAccessibility API, and it will provide tips and tricks for making all apps more usable by everyone.


iOS Performance and Power Optimization with Instruments

Creating an app that performs great is essential to making your users happy. Learn the techniques that will make your app launch faster, require less memory, efficiently use the network, and minimize power consumption. A must attend session for all iOS developers.


以上、22本。

1本50分とかあるから、適当にかいつまんで見ないと終わらないな・・・



2012-02-10

NSNotification, NSNotificationCenter によるオブジェクト間通知のパフォーマンス

NSNotification, NSNotificationCenter を用いたオブジェクト間連携は使いやすいのでついつい多用してしまうのですが、具体的に内部でどのような処理が行われていて、パフォーマンス面での影響はどのくらいなんだろう、ということをイメージできずにいたので、調べてみました。


で、下記のような超わかりやすいAppleの日本語ドキュメントを発見しました。


Cocoa Fundamentals Guide: 通知


その中でパフォーマンス面について勉強になった箇所を抜粋します。


通知センターは、オブザーバに対して通知を同期的に配信します。通知の送信すべてが完了するまで、送信側のオブジェクトには制御は戻りません


通知メカニズムは、オブジェクト状態の変化を監視するための、Cocoaの唯一の選択肢ではなく、実際に多くの状況において、望ましい選択肢とはいえません。Cocoaのバインディングテクノロジー、特にそれを可能にしているキー値監視(KVO)プロトコルとキー値バインディング(KVB)プロトコルを使用することによっても、アプリケーション内のオブジェクトは他のオブジェクトのプロパティの変化を監視することができます。バインディングメカニズムは、通知よりも効率よくこの役目を果たします。バインディングでは、監視対象のオブジェクトと監視元のオブジェクトの間の通信がダイレクトに行われ、通知センターのような仲介オブジェクトを必要としません。さらに、バインディングメカニズムの場合、監視対象以外の変更に対しては、通常の通知のようなパフォーマンスへの影響がありません。


ただし、バインディングよりも通知のほうが好ましい状況もあります。オブジェクトプロパティの変更以外のイベントを監視したい場合があります。あるいは、KVOおよびKVBに準拠した実装が現実的でない場合があります。送信され、監視の対象となる通知の数が少ない場合は特にそうです。


通知の使用が正当化されるような状況であっても、パフォーマンスへの影響を認識しておく必要があります。通知を送信すると、最終的にはローカルの通知センターによって監視元のオブジェクトに同期的に配信されます。これは、送信が同期か非同期かに関係なく行われます。オブザーバが多数存在する場合や、通知の処理中に各オブザーバが大量の作業を行うような場合、プログラムは極端に遅くなることがあります。このため、通知を使い過ぎたり、効率の悪い使い方をしたりしないように注意する必要があります。


通知の使用についての次のガイドラインが、この目的に役立ちます。

  • アプリケーションが監視すべき通知を慎重に選択する。
  • 通知を受け取るための登録を行うとき、通知名と送信元オブジェクトを限定する。
  • 通知を処理するメソッドを、できる限り効率よく動作するように実装する。
  • 大量のオブザーバの追加と削除を避ける。いくつかの「仲介」オブザーバを使用して、オブザーバからアクセスできるオブジェクトに対して通知の結果を伝えるほうがよい


2012-02-09

放物線状にアニメーションさせる

というタイトルで、はじめて Qiita に投稿してみました。


http://qiita.com/items/2269


(Twitter/Github/Hatena と同じ shu223 というIDです)


ちなみにこんなコード。

+ (void)startJump:(UIView *)view
         startPos:(CGPoint)startPos
        targetPos:(CGPoint)targetPos
           height:(CGFloat)height
         duration:(NSTimeInterval)duration
{
    CAKeyframeAnimation *pathAnimation = [CAKeyframeAnimation animationWithKeyPath:@"position"];
    pathAnimation.calculationMode = kCAAnimationPaced;
    pathAnimation.fillMode = kCAFillModeForwards;
    pathAnimation.removedOnCompletion = NO;

    CGMutablePathRef curvedPath = CGPathCreateMutable();
    CGPathMoveToPoint(curvedPath, NULL, startPos.x, startPos.y);
    CGPathAddCurveToPoint(curvedPath, NULL, 
                          startPos.x, startPos.y - height, 
                          targetPos.x, startPos.y - height, 
                          targetPos.x, targetPos.y);
    pathAnimation.path = curvedPath;
    CGPathRelease(curvedPath);

    pathAnimation.duration = duration;    

    [view.layer addAnimation:pathAnimation forKey:@"curveAnimation"];
}

ちなみに、アニメーション完了後に処理をさせたい場合は、CAAnimation のプロパティにある delegate を指定してやれば、

- (void)animationDidStop:(CAAnimation *)anim finished:(BOOL)flag;

が呼ばれます。



2012-02-07

Google AdMob Ads SDK 5.0.5 の更新内容

アプリを申請した数時間後に、AdMob SDK がアップデートされていたことを知り、(申請を取り下げてまで最新にする必要があるかどうか判断するために)更新内容について調べてみました。


こちらがリリースノート。

http://code.google.com/intl/ja/mobile/ads/docs/rel-notes.html#ios


7月リリースの4.1.1を利用していたのですが、気づけばメジャーアップデート含め3回も更新されていたようです。


5.0.5

11/30/2011

  • Added support for additional Rich Media interstitial ad formats for iPhone and iPad. This update will be forward-compatible with all future interstitial ad formats.
  • Improved interstitial impression tracking.
  • GADInterstitial has always been a one-time-use object, but it will now gracefully fail by calling didFailToReceiveAdWithError: on any requests to load or display an interstitial after the first request.

5.0.4

10/28/2011

  • Fix oversized buttons on retina displays in in-app browser.

5.0.3

10/24/2011

  • Custom search ads integration.
  • iOS 5.0 support.
  • Faster interstitial loads.
  • Modal view controller ad presentation fix.
  • Fixed anchor tag behavior.

よくわからない項目もありますが、とりあえず iOS 5.0 support というのがあるので、個人的には更新しといた方が良さげと判断しました。



2012-02-04

In-App Purchase の Status が "Developer Action Needed" な場合の対処方法

In-App Purchase がらみでリジェクトをいただいてしまい、修正バイナリをアップロードしたのですが、iTunes Connect の In-App Purchase 設定画面の Status のところが "Developer Action Needed" のままでした。


で、そのStatusを変更するボタンのような便利なものは見当たらず、いろいろ調べて試してみた結果、次の方法で無事 Status が "Waiting For Review" になりました。


Simply edit the description by clicking on the language name next to the REJECTED marker. Add a space at the end of the Display Description (only shown to Apple) if you don't want to change anything. After saving, the REjECTED marker will change to PENDING and you'll be back in business.


各言語の設定の "Display Description" のところに書いた文言の最後にスペースつけて保存する、というだいぶ気持ち悪い方法です。



ちなみに、試してみたけど効果がなかった方法

  • スクリーンショットをアップしなおす
  • 価格を変更してまた元に戻す

参考ページ



2009 | 08 |
2011 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2012 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2013 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2014 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2015 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2016 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 11 | 12 |
2017 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2018 | 02 |