我们在过去的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方法和解决方案的答案.
我正在使用Xamarin iOS开发一个相当简单的应用程序,我为.app文件获得的最小尺寸是13.5 MB.
我已经执行了所有推荐的优化 - 没有调试符号,LVVM代码生成,thumb-2,链接所有程序集,仅单一体系结构(ARMV7).
第一个问题是,我的13.5 MB听起来像Xamarin iOS的预期,或者我可能做错了什么?
第二个问题是,Xamarin iOS增加了多少额外的大小开销(粗略地)?
第三个问题是,大概有多小的Hello World应用程序可以编译成使用Xamarin iOS?
第四个问题是,本地Hello World应用程序大致可以编译成多小?
.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 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) 有没有办法通过将实际的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.
我有财产
[XmlElement]
public string[] Emails { get; set; }
Run Code Online (Sandbox Code Playgroud)
在构造函数中初始化为string [0]。
如果我XML序列化和反序列化此对象的默认实例,则该属性为NULL。
如何告诉XML序列化器对此属性使用空数组而不是NULL?
如何实现模板方法模式的变体,其中具体类不从基类继承,但保持模式的整体特征。它不能继承的原因是它被迫从另一个类继承,并且多重继承不可用。
例如,假设以下 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 的情况下获得相同的结果?
我正在写一个正在做的触发器
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) 在.NET 3.5中处理非常大的XML文件的"推荐"方法是什么?
对于写入,我想一次生成一个元素然后附加到文件.
为了阅读,我同样想要一次读取一个元素(按照与写入的顺序相同).
我有一些想法如何使用字符串和File.Append,但.NET 3.5提供XML Api来处理任意大的XML文件?
我注意到我用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?
假设有一个包含非主键列(A,B,C,D)的表,该表的索引是(A,B,C,D)
涉及(A,B,C,D)子集的查询会使用索引吗?如上所述,部分键查找存在哪种特质?
我对这在SQL Server,Sqlite,Firebird中的工作方式特别感兴趣。
我有一种情况,我必须同步调用异步方法,并按如下方式完成:
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) 在 Visual Studio 2015 中,有多种项目类型可用于制作 Windows Phone 应用程序。这些是:
问题:如果我使用选项 1(Windows 通用),应用程序是否会在:
欢迎补充评论/评论。
windows-phone windows-phone-8 win-universal-app windows-10 visual-studio-2015
c# ×7
.net ×6
xamarin ×4
xamarin.ios ×3
ios ×2
sql ×2
sql-server ×2
xml ×2
android ×1
asynchronous ×1
c#-2.0 ×1
firebird ×1
indexing ×1
lifecycle ×1
memory-leaks ×1
oop ×1
sqlite ×1
transitions ×1
windows-10 ×1