2

現在、私はデータ保護属性を設定する方法を使用していますが、それは私にはかなり厄介です。を扱う代わりに、より直接的な方法があるかどうか疑問に思っていNSStringますNSMutableDictionary。それが私が現在使用しているものです(「using」ステートメントで最適化できることは知っていますが、それは私がここで求めているものではありません):

public static void SetDataProtectionFor ( string sFileToProtect )
        {
            NSError oError = null;
            NSMutableDictionary oDic = null;

            try
            {

                oDic = new NSMutableDictionary ();
                oDic.Add ( new NSString ("NSFileProtectionKey"), new NSString ("NSFileProtectionComplete") );


                NSFileManager.DefaultManager.SetAttributes ( oDic, sFileToProtect, out oError );
                if ( oError != null )
                {
                    throw new DataProtectionGoneMissingException ();
                }
            }
            catch ( Exception ex )
            {
                throw new DataProtectionGoneMissingException ();
            }
            finally
            {
                if ( oDic != null )
                {
                    oDic.Dispose ();
                    oDic = null;
                }

            }
        }
4

2 に答える 2

1

新しい を作成する必要がないように、 onSetObjectではなくAddonを使用できますが、実際には、既に持っているものとそれほど大きな違いありません。NSMutableDictionaryNSString

var oDic = new NSMutableDictionary ();
oDic.SetObject ("NSFileProtectionComplete", "NSFileProtectionKey");

私の知る限り、これがファイル属性を設定する唯一の方法です。

于 2012-08-09T08:59:34.880 に答える
1

たった今 ?あまりない。これが Objective-C の方法であり、MonoTouch (生成された) バインディングを使用すると、同じパターンに従うことができます。

を作成せNSStringずに、MonoTouch が提供する 'NSFileManager.FileProtectionCompleteやなどを使用できNSFileManager.FileProtectionKeyます。これにより、2 つのインスタンスが何度も作成されることが回避NSStringされ (メソッドが複数回呼び出された場合、MonoTouch バージョンは遅延して作成され、キャッシュされます)、タイプミスの可能性がなくなります。

したがって、C#3 構文を使用すると、次のようになります。

NSMutableDictionary oDic = new NSMutableDictionary () {
    { NSFileManager.FileProtectionKey, NSFileManager.FileProtectionComplete }
};

また、 と同じ仕事をするために、より C# っぽい API を提供しようとNSDictionaryしています。OTOH オプションに使用する API はたくさんあるNSDictionaryので、(これまでのところ) 最も一般的なものにしかありません。

注: API が改善される可能性があるケースを見つけた場合は、お気軽に機能強化のバグ レポートを提出してください。

たとえば、(以前に行われた)同様のケースに基づいて、これは理想的には次のようになります。

var attr = new NSFileManagerAttribute ();
attr.ProtectionKey = NSFileManager.ProtectionComplete; // enum version
NSFileManager.DefaultManager.SetFileAttribute (sFileToProtect, attr);

多くのコード行を節約することはできませんが (少なくとも単一の値の場合)、ソースの見栄えが良くなり (IMO)、コード補完で使いやすくなり、(文字列に対する) タイプミスを回避できます。

于 2012-08-09T15:07:14.903 に答える