我有一个解决一些文本的多线程应用程序,它需要使用英文文化信息来解析这个文本中的数字.所以,我不想每次调用解析函数时都创建EngCulture.目前我正在将EngCulture作为参数传递,但我对此并不满意.我想将EngCulture定义为静态成员,因此它将由线程共享.
Msdn文档说"这种类型的任何公共静态(在Visual Basic中共享)成员都是线程安全的.任何实例成员都不能保证是线程安全的." 我只是使用以下函数,所以我怎么知道TryParse是否使用EngCulture的任何实例成员?
public static CultureInfo EngCulture = new CultureInfo("en-US", false);
void parser()
{
if (int.TryParse(value, NumberStyles.Number, EngCulture, out num))...
}
Run Code Online (Sandbox Code Playgroud) 从Apple的View Controller编程指南/有效管理内存;
didReceiveMemoryWarning
使用此方法可以释放与视图控制器关联的所有非关键自定义数据结构.虽然您不会使用此方法来释放对视图对象的引用,但您可以使用它来释放您尚未在viewDidUnload方法中发布的任何与视图相关的数据结构.(视图对象本身应始终在viewDidUnload方法中释放.)
viewDidUnload
您可以使用viewDidUnload方法释放视图特定的任何数据,并且如果视图再次加载到内存中,则可以轻松地重新创建.但是,如果重新创建数据可能过于耗时,则不必在此处释放相应的数据对象.相反,您应该考虑在didReceiveMemoryWarning方法中释放这些对象.
对于didReceiveMemoryWarning,我们建议取消分配非关键数据结构.那么,什么是关键的,什么是非关键的?
此外,它说要发布我们尚未在viewDidUnload中发布的内容.但是当存在内存警告时,调用didReceiveMemoryWarning并且可以卸载视图,然后调用viewDidUnload.那么,它是在谈论将这些代码移动到前一个事件的方法(didReceiveMemoryWarning)还是我错过了一些关于事件顺序的东西?
对于viewDidUnload,我们建议您在重新加载视图时轻松重新创建数据.因此,如果视图正在使用且无法卸载,为什么我们会在didReceiveMemoryWarning中释放耗时的数据?在发布这些数据之后,当用户尝试在当前视图中执行某些操作时,加载它们也将非常耗时.
在PersonBusiness.GetQuery
方法中,PersonEntity
遍及代码,并且有许多其他实体类型将类似地实现此方法.
我想在PersonBusiness中使用泛型参数来减少特定实体类型的使用,因为会有像其他实体一样的实现,我想阻止使用其他类型而不是预期的实体类型.但是通用参数使用版本无法成功或满足.
如果它更有意义,我也想使用接口而不是具体类.
public class Entities: DbContext
{
public virtual DbSet<PersonEntity> PersonSet { get; set; }
}
public class PersonEntity
{
public int Id { get; set; }
public string FullName { get; set; }
}
public class BaseBusiness
{
public Entities Db => new Entities();
}
public abstract class BaseBusiness<T> : BaseBusiness where T : class
{
public IQueryable<T> GetQuery<TKey>(Expression<Func<T, bool>> where,
Expression<Func<T, TKey>> orderBy)
{
IQueryable<T> query = Db.Set<T>();
if (where != null)
query …
Run Code Online (Sandbox Code Playgroud) 我有一个从选项卡式应用程序模板创建的应用程序.(ARC,iOS 4)
问题
现在,当ModalViewCont在屏幕上,按Home键将应用程序放在后台并在获得应用程序后,关闭ModalViewCont不会带回ViewCont2的视图,而是带有底部标签栏的黑屏.没有放置应用程序背景/前景就会发生同样的事情; 如果在点击2.制表符之前点击其他选项卡.(编辑:只有在viewWillDisappear中将self.view设置为nil而不是viewDidDisappear时才会发生这种情况.)
我确定ViewCont2加载一个新视图(检查它的引用)但是视图的superview是nil所以新视图不会显示而是显示黑屏.
事情没有用
我考虑的解决方案
_
if (self.view.superview == nil)
{
self.tabBarController.selectedViewController = nil;
self.tabBarController.selectedViewController = self;
}
Run Code Online (Sandbox Code Playgroud)
问题
编辑:似乎早于它应该调用viewDidLoad时(即在viewWillDisappear而不是viewDidDisappear中查看视图时),不设置superview.
闭包中的局部函数声明一个具有相同名称的变量,该变量存在于闭包中.那么,我们怎么能从本地函数访问closure的变量呢?
function closure()
{
var xVar;
function func1()
{
var xVar;
// how to distinguish local and closure scopes.
return xVar;
}
return function () { return func1(); };
}
Run Code Online (Sandbox Code Playgroud)
创建私有对象并将私有变量作为此对象的属性可能会有所帮助.但我想知道是否有更好,更整洁的解决方案.范围链可以帮助吗?
我已编辑完全关闭.无论如何,闭包在这里并没有太多关注,它可以考虑内部函数,但是,可能有某种方式闭包的解决方案.
谢谢
我们知道必须组合alloc和init的alloc/init的完整模式.
NSObject *myObj = [[NSObject alloc] init];
Run Code Online (Sandbox Code Playgroud)
1- init方法从另一个源接收对象(不是来自alloc,new,copy或类似或保留),因此根据基本的内存管理规则,它不是所有者,也不能释放它.但是,"分配和初始化对象/返回对象"文章说init可以释放接收器.
当它违背基本规则时,这怎么可能呢?
2-此外,从同一篇文章中,init可以返回另一个对象或nil.因此,在这种情况下,当我们使用alloc/init的完整模式时,我们无法释放alloc返回的对象,但我们只能释放从init返回的对象,并且init释放它从alloc而不是我们收到的对象.
但是init不是alloc,new,copy或者类似的方法,因此我们不能释放从它返回的对象,因为它不会给我们对象的所有权.
我们如何释放从init返回的对象,尽管这违反了基本规则?
3-或者,为了遵守同一篇文章的最后一段,我们必须接受init方法作为特例并使用alloc/init模式作为基本规则的例外吗?
内存管理基本规则:
- 您只释放或自动释放您拥有的对象.
- 如果使用名称以"alloc"或"new"开头或包含"copy"(例如,alloc,newObject或mutableCopy)的方法创建对象,或者向其发送保留消息,则获取对象的所有权.
- 您使用release或autorelease放弃对象的所有权.autorelease只是意味着"将来发送一条发布消息"(了解这将是什么时候,请参阅"Autorelease Pools"). http://developer.apple.com/library/ios/#documentation/Cocoa/Conceptual/MemoryMgmt/Articles/mmRules.html
分配和初始化对象/返回的对象:
但是,在某些情况下,此责任可能意味着返回与接收者不同的对象.例如,如果一个类保留了一个命名对象列表,它可能会提供一个initWithName:方法来初始化新实例.如果每个名称只能有一个对象,initWithName:可能会拒绝为两个对象分配相同的名称.当要求为新实例分配一个已被另一个对象使用的名称时,它可以释放新分配的实例并返回另一个对象 - 确保名称的唯一性,同时提供所要求的内容,实例请求的名称.
在少数情况下,init ...方法可能无法按照要求执行操作.例如,initFromFile:方法可能从作为参数传递的文件中获取所需的数据.如果传递的文件名与实际文件不对应,则无法完成初始化.在这种情况下,init ...方法可以释放接收器并返回nil,表示无法创建请求的对象.
因为init ... 方法可能返回除了新分配的接收者以外的对象,甚至返回nil,所以程序使用初始化方法返回的值,而不仅仅是alloc或allocWithZone返回的值,这一点很重要.以下代码非常危险,因为它忽略了init的返回.
Run Code Online (Sandbox Code Playgroud)id anObject = [SomeClass alloc]; [anObject init]; [anObject someOtherMessage];
相反,为了安全地初始化对象,您应该在一行代码中组合分配和初始化消息.
Run Code Online (Sandbox Code Playgroud)id anObject = [[SomeClass alloc] init]; [anObject someOtherMessage];
cocoa memory-management allocation initialization objective-c
我希望通过这项研究了解CoreFoundation CGColor对象的内部结构.我可以从免费的石英项目中找到CGColor结构的样本定义,它似乎与IOS声明相符(依赖于我的研究).
typedef struct CGColor {
CFRuntimeBase obj;
CFTypeID colorID;
CGColorSpaceRef colorSpace;
CGPatternRef pattern;
size_t numberOfComponents;
CGFloat *components;
} *CGColorRef;
Run Code Online (Sandbox Code Playgroud)
(colorID字段由free quartz命名为nextID,但我认为它是IOS的唯一标识,因此它不是一种下一个标识符.)
保持全局线程安全唯一值,对于创建并分配给colorID成员的每个CGColor对象,该值增加1.只有未记录的CGColorGetIdentifier()函数返回此值.(我猜测单调增加id值,它可以在设备与校准颜色查找之间进行转换时提高性能,反之亦然.)
我检查了CoreGraphics及其资源库.我发现只有ripc_GetColor(libRIP.A.dylib)函数调用CGColorGetIdentifier()函数.
调用CGColorGetIdentifier的堆栈;(希望能帮助推断colorID)
0 com.apple.CoreGraphics CGColorGetIdentifier + 0
1 libRIP.A.dylib ripc_GetColor + 112
2 libRIP.A.dylib ripc_DrawGlyphs + 1740
3 com.apple.CoreGraphics CGContextDelegateDrawGlyphs + 108
4 com.apple.CoreGraphics drawGlyphs + 284
5 com.apple.CoreGraphics CGContextShowGlyphsWithAdvances + 208
Run Code Online (Sandbox Code Playgroud)
对于当前的颜色图形上下文操作,ripc_GetColor()计算当前笔触/填充颜色的一些变换,并使用此颜色的referenceID和colorID缓存这些变换.
因此,对于下一个图形上下文操作,ripc_GetColor()将先前缓存的当前引用和colorID值进行比较,以跳过已为最后一个图形上下文操作缓存的颜色转换.
我们知道在创建另一个对象时可以使用已发布对象的引用(内存地址).因此,仅检查引用将不足以使相同的颜色对象有效,但我们需要比较内容或某种哈希值.因此,我们可以为此目的使用唯一标识符值.
但是,标识符可以用于单个对象及其引用,因此仅比较ID就足够了.但是,使用了refs和id.我不认为工程师忽视了这么简单和至关重要的事情.
所以,我试图找出比较id和refs的必要性,同时只比较id就足够了.
是否遗留了以前的方法,所以不能完全放弃?
Environment.WorkingSet 错误地报告了在 Windows 2003 Server 上运行的网站的内存使用情况。(操作系统版本:Microsoft Windows NT 5.2.3790 Service Pack 2,.NET 版本:2.0.50727.3607)
它将内存报告为 Working Set(Physical Mem.): 1952 MB (2047468061)。
同一个网站在 Windows Vista 上本地运行,工作集(物理内存):49 MB (51924992)。
我对服务器的访问有限,支持也很有限:(。所以我通过遍历 VirtualQuery 计算了总内存。具有状态的页面总数:MEM_FREE 是 1300 MB。(我猜服务器有 4 GB 的 RAM,PAE 是未启用,最大用户模式虚拟地址为 0x7fff0000。)
所以,我知道工作集不仅仅是关于虚拟内存。但是,有这么高的工作集,而在另一台机器上却很低,这正常吗?
如果我理解正确,我们可以将void*归类为"C可保持指针类型". 因此,将它隐式桥接到Objective-C对象.但是,编译器会引发需要显式桥接的错误.
const void * somePtr = (void *)0x12345678;
- (void)someMethod:(id)sender
{
NSObject *obj = (NSObject *)somePtr;
}
Run Code Online (Sandbox Code Playgroud)
此外,我检查了空指针常量,它编译时没有明确的桥接.
NSObject *obj = (void *)0;
Run Code Online (Sandbox Code Playgroud)
我正在使用XCode 4.5(Clang 4.1(标签/ Apple/clang-421.11.66)(基于LLVM 3.1svn)).
问题: 我知道向NSObject分配一些任意/不相关的指针有点奇怪,但我想确保是否正确理解规则.我对"C可保持指针类型"有点怀疑.描述; 特别是关于(可能是合格的)和(可能是限定词)的意图.我们可以将哪些指针类型归类为"C可保持指针类型"?
此外,它实际上是指系统中的"系统全局变量"声明的全局变量吗?
3.3.2.转换为具有已知语义的表达式的可保留对象指针类型 [从Apple 4.0开始,LLVM 3.1]
表达式已知为保留不可知,如果它是:
- Objective-C字符串文字,
- 来自const系统全局变量的C可保持指针类型的加载,
- 或空指针常量.
如果强制转换操作数未知或已知保留不可知,则转换将被视为__bridge强制转换.
7.8.C可保留的指针类型
如果类型是指向(可能是限定的) void或指向(可能是限定符)结构或类类型的指针,则类型是C可保留指针类型.
我使用mshtml进行html解析.(版本7.0.3300.0,C:\ Program Files\Microsoft.NET\Primary Interop Assemblies\Microsoft.mshtml.dll).
HTMLDocumentClass有一个write方法,所以我使用它,但它引发了与ErrorCode的ComException:-2147352571和消息:类型不匹配.它是什么原因?如果不使用HTMLDocumentClass的write方法,他们为什么定义?
HTMLDocumentClass getHTMLDocument(string html)
{
HTMLDocumentClass doc = new HTMLDocumentClass();
doc.write(new object[] { html }); // raises exception
doc.close();
return doc;
}
HTMLDocumentClass getHTMLDocument2(string html)
{
HTMLDocumentClass doc = new HTMLDocumentClass();
IHTMLDocument2 doc2 = (IHTMLDocument2)doc;
doc2.write(new object[] { html });
doc2.close();
return doc;
}
Run Code Online (Sandbox Code Playgroud) 我应该为varSecondViewController使用release还是autorelease?
-(IBAction)takeNextStep: (id) sender
{
SecondViewController *varSecondViewController = [[SecondViewController alloc]
initWithNibName:@"SecondViewController" bundle:nil];
[self.navigationController pushViewController:varSecondViewController animated:YES];
[varSecondViewController release];
}
Run Code Online (Sandbox Code Playgroud) var
S: string;
begin
SetLength(S, MAX_SIZE);// when casting to a PChar, be sure the string is not empty
SetLength(S, GetModuleFilename(0, PChar(S), Length(S)));
// statements
end;
Run Code Online (Sandbox Code Playgroud)
为了消除复制缓冲区的开销,可以将字符串转换为PChar(如果您确定例程不需要PChar保留在内存中). http://docwiki.embarcadero.com/RADStudio/en/Passing_a_Local_Variable_as_a_PChar
我们有一个字符串,它将保留在内存中,直到其引用计数递减为0,因此在范围过程中不会删除它.那么,为什么我们需要PChar
留在记忆中呢?是否有一些API函数需要PChar
先前传递给另一个API函数的完全相同的引用?
特别是我正在考虑示例代码.所以,问题必须是"为什么一个例程需要传递给它的PChar(字符串中的类型转换)在它返回后仍留在内存中?".异步i/o例程,或者在调用者返回后访问传递的pchar的异步方法,或者由另一个线程修改全局字符串的原因很好.
当启用时ARC,以下代码使得物镜对于保留两次块通过调用objc_retain()和objc_retainBlock().(因此retainCount块定义后变成3).
我检查了obj不在自动释放池中,并且在方法结束时有两个objc_release()调用obj.(我知道计数保留没有意义,但我正在检查objc_retain()调用,而不是几乎没有检查保留计数.)这背后的基本原理是什么?
-(void)myMethod
{
NSObject *obj = [[NSObject alloc] init];
NSLog(@"obj %@ retaincount %ld", obj, CFGetRetainCount((__bridge CFTypeRef)obj));
void (^myBlock)(void) = ^()
{
NSLog(@"obj %@ retaincount %ld", obj, CFGetRetainCount((__bridge CFTypeRef)obj));
};
NSLog(@"obj %@ retaincount %ld", obj, CFGetRetainCount((__bridge CFTypeRef)obj));
myBlock();
}
Run Code Online (Sandbox Code Playgroud)
仅仅保留obj一次以便通过块捕获它是不够的?
注意:此外,当我删除myBlock变量并调用它时,所以只使用^(){...}定义并且永远不会调用该定义,obj仍然保留objc_retain(),这看起来很奇怪.我正在使用XCode 4.3.2.
memory-management objective-c retain retaincount objective-c-blocks