小编Her*_*eld的帖子

Xamarin iOS内存随处可见

我们在过去的8个月里一直在使用Xamarin iOS,并开发了一个具有许多屏幕,功能和嵌套控件的非平凡企业应用程序.我们已经完成了我们自己的MVVM拱门,跨平台BLL和DAL为"推荐".我们在Android之间共享代码,甚至我们的BLL/DAL也在我们的网络产品上使用.

一切都很好,除了现在在项目的发布阶段,我们在基于Xamarin iOS的应用程序中发现无法修复的内存泄漏.我们已经遵循了所有"指南"来解决这个问题,但实际情况是C#GC和Obj-C ARC似乎是不兼容的垃圾收集机制,它们以当前的方式在monotouch平台中相互叠加.

我们发现现实情况是,原生对象和管理对象之间的硬周期WILL发生,FREQUENTLY对于任何不平凡的应用程序.在您使用lambdas或手势识别器的任何地方都可以轻松实现这一点.加上MVVM的复杂性,这几乎是一种保证.只想念其中一种情况,并且永远不会收集整个对象图.这些图表将引诱其他物体进入并像癌症一样成长,最终导致iOS的迅速和无情的消灭.

Xamarin的答案是对这个问题的不感兴趣的推迟以及"开发者应该避免这些情况"的不切实际的期望.仔细考虑这一点就可以看出这是对垃圾收集在Xamarin中基本被打破的承认.

现在对我的认识是,在传统的c#.NET意义上,你并没有真正在Xamarin iOS中获得"垃圾收集".您需要使用"垃圾维护"模式实际上让GC移动并完成其工作,即使这样,它也永远不会是完美的 - 非决定性的.

我的公司投入了大量资金,试图阻止我们的应用程序崩溃和/或内存不足.我们基本上必须明确地和递归地处理每一件该死的东西,并在应用程序中实施垃圾维护模式,只是为了阻止崩溃并拥有我们可以销售的可行产品.我们的客户是支持和宽容的,但我们知道这不可能永远存在.我们希望Xamarin有一个专门的团队来处理这个问题,并且一劳永逸地得到它.不幸的是,看起来不像.

问题是,我们的经验是用Xamarin编写的非平凡企业级应用程序的例外或规则吗?

UPDATE

请参阅DisposeEx方法和解决方案的答案.

c# garbage-collection xamarin.ios ios xamarin

49
推荐指数
5
解决办法
2万
查看次数

Xamarin iOS应用程序是不合理的膨胀?

我正在使用Xamarin iOS开发一个相当简单的应用程序,我为.app文件获得的最小尺寸是13.5 MB.

我已经执行了所有推荐的优化 - 没有调试符号,LVVM代码生成,thumb-2,链接所有程序集,仅单一体系结构(ARMV7).

第一个问题是,我的13.5 MB听起来像Xamarin iOS的预期,或者我可能做错了什么?

第二个问题是,Xamarin iOS增加了多少额外的大小开销(粗略地)?

第三个问题是,大概有多小的Hello World应用程序可以编译成使用Xamarin iOS?

第四个问题是,本地Hello World应用程序大致可以编译成多小?

xamarin.ios ios xamarin

12
推荐指数
1
解决办法
6993
查看次数

检测信任级别

.NET应用程序如何检测运行它的信任级别?

具体来说,我想要一种方法来做类似的事情

  if (RUNNING IN GREATER THAN MEDIUM TRUST) { 
    // set private fields & properties using reflection
  }
Run Code Online (Sandbox Code Playgroud)

我目前的解决方案是使用

public static class CodeAccessSecurityTool {
    private static volatile bool _unrestrictedFeatureSet = false;
    private static volatile bool _determinedUnrestrictedFeatureSet = false;
    private static readonly object _threadLock = new object();

    public static bool HasUnrestrictedFeatureSet {
        get {
            if (!_determinedUnrestrictedFeatureSet)
                lock (_threadLock) {
                    if (!_determinedUnrestrictedFeatureSet) {
                        try {
                            // See if we're running in full trust
                            new PermissionSet(PermissionState.Unrestricted).Demand();
                            _unrestrictedFeatureSet = true;
                        } catch (SecurityException) …
Run Code Online (Sandbox Code Playgroud)

.net c#-2.0

8
推荐指数
3
解决办法
1675
查看次数

在.NET 3.5中实现Enum.TryParse

我如何在.NET 3.5中实现.NET 4的Enum.TryParse方法?

public static bool TryParse<TEnum>(string value, out TEnum result) where TEnum : struct
Run Code Online (Sandbox Code Playgroud)

.net c#

7
推荐指数
2
解决办法
6699
查看次数

使用动画对象而不是资源ID覆盖挂起的转换

有没有办法通过将实际的Animation对象而不是ID传递给动画资源来覆盖挂起的转换?

startActivity(intent);
overridePendingTransition(R.anim.fadein, R.anim.fadeout);
Run Code Online (Sandbox Code Playgroud)

startActivity(intent);
overridePendingTransition(new MyFadeInAnimation(), new MyFadeOutAnimation());
Run Code Online (Sandbox Code Playgroud)

如果没有,有没有办法以编程方式手动注册动画资源(并获得ID)?

出于其他原因,我真的不想将活动过渡动画定义为XML.

android transitions android-activity xamarin

6
推荐指数
1
解决办法
5285
查看次数

XML序列化以使用空数组而不是NULL

我有财产

 [XmlElement]
 public string[] Emails { get; set; }
Run Code Online (Sandbox Code Playgroud)

在构造函数中初始化为string [0]。

如果我XML序列化和反序列化此对象的默认实例,则该属性为NULL。

如何告诉XML序列化器对此属性使用空数组而不是NULL?

.net c# xml serialization xml-serialization

5
推荐指数
1
解决办法
872
查看次数

没有继承的模板方法模式

如何实现模板方法模式的变体,其中具体类不从基类继承,但保持模式的整体特征。它不能继承的原因是它被迫从另一个类继承,并且多重继承不可用。

例如,假设以下 Tempate Method 模式:

public abstract class BaseClass {
    public void Alpha() {
        Beta();
    }

    public abstract void Beta();

    public void Gamma() {
        Delta();
    }

    public abstract void Delta();

}

public ConcreteClass : BaseClass {
    public override void Beta() {
        Gamma();
    }

    public override void Delta() {
        Console.WriteLine("Delta");
    }
}

...
var object = new ConcreteClass();
object.Alpha(); // will outout "Delta"
Run Code Online (Sandbox Code Playgroud)

如何在没有 ConcreteClass 继承 BaseClass 的情况下获得相同的结果?

.net c# oop design-patterns template-method-pattern

5
推荐指数
1
解决办法
1663
查看次数

检查不平等的有效方法

我正在写一个正在做的触发器

IF (@A <> @B)
    ...
Run Code Online (Sandbox Code Playgroud)

但这不适用于@A或@B上的NULL值.它通常的方式是

IF (@A <> @B) OR (@A IS NOT NULL AND @B IS NULL) OR (@A IS NULL AND @B IS NOT NULL)
Run Code Online (Sandbox Code Playgroud)

但这涉及最多9次比较而不是1次!

我可以

SET ANSI_NULLS OFF
Run Code Online (Sandbox Code Playgroud)

但显然不建议这样做(并且不推荐使用).

那么什么是最好的解决方案呢?当它应该为1时,只需进行9次比较即可进行简单的不等式检查?触发器不是性能关键,但确实需要快速.批量加载时,这可能会大大降低速度.

绩效测试

以下是性能测试的结果,该测试检查不等式一百万次,使得90%的时间值不相等,每个值可能为空的时间的10%.

IF (@A <> @B) OR (@A IS NULL AND @B IS NOT NULL) OR (@A IS NOT NULL AND @B IS NULL)
Run Code Online (Sandbox Code Playgroud)

结果:平均3848ms

IF (ISNULL(@A, 0) <> ISNULL(@B, 0)) 
Run Code Online (Sandbox Code Playgroud)

结果:平均3942ms

IF (@A = @B) GOTO Equal ELSE IF …
Run Code Online (Sandbox Code Playgroud)

sql sql-server

4
推荐指数
1
解决办法
250
查看次数

使用.NET 3.5处理大型XML文件

在.NET 3.5中处理非常大的XML文件的"推荐"方法是什么?

对于写入,我想一次生成一个元素然后附加到文件.

为了阅读,我同样想要一次读取一个元素(按照与写入的顺序相同).

我有一些想法如何使用字符串和File.Append,但.NET 3.5提供XML Api来处理任意大的XML文件?

.net c# xml

3
推荐指数
1
解决办法
1265
查看次数

UIViewController没有被处理掉

我注意到我用Xamarin iOS 7.2.2编写的大型应用程序的间歇性崩溃.乐器告诉我,我的应用程序在内存使用方面的增长并没有真正下降.

我确保在我的UIViewControllers中取消所有事件,尽管如此,我的UIViewControllers还没有被处理掉.

我知道他们没有被处理,因为他们的断点从未执行过.

示例性处理方法:

    protected override void Dispose(bool disposing) {
        _someViewController = null;
        _otherView = null;
        ReleaseDesignerOutlets();
        base.Dispose(disposing);
    }
Run Code Online (Sandbox Code Playgroud)

我没有做任何花哨的事情,除了取消对其他视图的引用和发布设计器出口,但它永远不会被调用.

为什么在从导航控制器弹出我的视图控制器后没有调用Dispose?

c# lifecycle memory-leaks xamarin.ios xamarin

3
推荐指数
1
解决办法
2759
查看次数

部分键查询

假设有一个包含非主键列(A,B,C,D)的表,该表的索引是(A,B,C,D)

涉及(A,B,C,D)子集的查询会使用索引吗?如上所述,部分键查找存在哪种特质?

我对这在SQL Server,Sqlite,Firebird中的工作方式特别感兴趣。

sql sql-server sqlite indexing firebird

2
推荐指数
1
解决办法
534
查看次数

在执行同步异步时,.NET中的内存泄漏

我有一种情况,我必须同步调用异步方法,并按如下方式完成:

 obj.asyncMethod().Wait(myCancelToken)
Run Code Online (Sandbox Code Playgroud)

如果取消令牌被切换,则尽管通过using语句激活,但任务中的一次性物品将不会被处置.

以下程序说明了问题:

        using System;
        using System.Threading;
        using System.Threading.Tasks;

        namespace LeakTest {

            class Program {
                static void Main(string[] args) {
                    try {
                        var timeout = new CancellationTokenSource(TimeSpan.FromMilliseconds(100));
                        LongRunningTask().Wait(timeout.Token);
                    } catch (OperationCanceledException error) {                
                        //  handling timeout is logically okay, but expect nothing to be leaked
                    }
                    Console.WriteLine("Leaked Instances = {0}", DisposableResource.Instances);
                    Console.ReadKey();
                }

                static async Task LongRunningTask() {
                    using (var resource = new DisposableResource()) {
                        await Task.Run( () => Thread.Sleep(1000));
                    }
                }

                public class DisposableResource …
Run Code Online (Sandbox Code Playgroud)

.net c# asynchronous task-parallel-library

0
推荐指数
1
解决办法
830
查看次数

Windows Phone 上的 Windows 通用应用程序

在 Visual Studio 2015 中,有多种项目类型可用于制作 Windows Phone 应用程序。这些是:

  1. Windows -> 通用
  2. Windows 8 -> 通用
  3. 视窗 8 -> 视窗
  4. Windows 8 -> Windows Phone

问题:如果我使用选项 1(Windows 通用),应用程序是否会在:

  1. Windows Phone 8.0 手机
  2. Windows 8.0 平板电脑
  3. Windows 8.0 桌面
  4. Windows Phone 8.1 手机
  5. Windows 8.1 平板电脑
  6. Windows 8.1 桌面
  7. Windows Phone 10 手机
  8. Windows 10 平板电脑
  9. Windows 10 桌面

欢迎补充评论/评论。

windows-phone windows-phone-8 win-universal-app windows-10 visual-studio-2015

0
推荐指数
1
解决办法
106
查看次数