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

您可以使用SetObject而不是Add使用NSMutableDictionary来避免必须创建新NSString的,但它并没有真正对您已经拥有的东西产生太大影响,例如

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

据我所知,这是设置文件属性的唯一方法。

于 2012-08-09T08:59:34.880 回答
1

现在 ?不多。这就是 Objective-C 的方式,MonoTouch(生成的)绑定允许您遵循相同的模式。

您可以避免创建NSString和使用 MonoTouch 提供的那些,例如 'NSFileManager.FileProtectionCompleteNSFileManager.FileProtectionKey. 这将避免NSString多次创建两个实例(如果您的方法被多次调用,MonoTouch 版本将被延迟创建和缓存)并消除拼写错误的可能性。

因此,使用 C#3 语法将变为:

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

此外,我们尝试提供更多 C#-ish API 来完成与NSDictionary. OTOH,因为有很多 APINSDictionary用于选项,我们只有(到目前为止)最常见的选项。

注意:当您发现 API 可能更好的情况时,请随时提交增强错误报告

例如,基于类似的案例(之前完成的),理想情况下应该/应该是这样的:

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

它不会节省很多代码行(至少对于单个值),但它会使源代码看起来更好(IMO)并且更易于使用代码完成并避免拼写错误(超过字符串)。

于 2012-08-09T15:07:14.903 回答