我正在使用Clang的原始拳击功能来打包枚举成员 NSNumber
Clang doc 的Boxed Enums部分说明了编译器将成员枚举成整数,除非指定了类型.
有趣的是,我得到不同大小的整数,这取决于我将枚举成员传递给方法的方式.我已经能够将案例分解为以下代码
typedef enum _MyEnum {
MyEnumMember1 = 1000
} MyEnum;
- (void)testEnumerationBoxing
{
NSNumber *numberA = [self testA];
NSNumber *numberB = [self testB:MyEnumMember1];
CFNumberType numberTypeA = CFNumberGetType((__bridge CFNumberRef) numberA);
CFNumberType numberTypeB = CFNumberGetType((__bridge CFNumberRef) numberB);
NSLog(@"CF Number type for A: %lu; B: %lu", numberTypeA, numberTypeB);
}
- (NSNumber *)testA
{
return @(MyEnumMember1);
}
- (NSNumber *)testB:(MyEnum)enumMember
{
return @(enumMember);
}
Run Code Online (Sandbox Code Playgroud)
控制台输出是
CF编号类型为A:3; B:4
(第一个是kCFNumberSInt32Type,第二个是kCFNumberSInt64Type)
如果我改变声明,typedef enum _MyEnum …
对于具有将swift添加到现有Objective-C代码库中的经验的开发人员而言,这是一个性能问题.
我的前提是:最终Bridging-Header.h可能变得非常大(它可能最终包含所有1.5k存在的Objective-C类(给予或接受那些不能从Swift访问的类)),反之亦然PRODUCT-Swift.h生成头.
我担心编译性能可能会急剧下降:每次包含的.h类都发生变化时,都必须重新编译所有.swift文件.
是这样的吗?如果是这样,有没有办法优化性能?
澄清:想象一下,您将整个项目类包含到.pch文件中,现在每个类更改都会触发整个项目的重新编译.这种方式类似Bridging-Header.h吗?
我需要在构建项目时自动获取Xcode生成的权利文件.
通常(即使您没有选择任何明确的功能),您可以找到一个$DERIVED_FILES_DIR/$PRODUCT_NAME.xcent,它包含有关您的团队和钥匙串访问的一般信息.
有没有人知道绕过构建阶段生成它的方法.我想弄清楚与指定显式授权文件或使用功能窗格指定它们的事实无关的流程.
也许我错过了一些明显的东西,任何信息都会非常感激.
有没有办法指定特定方法参数具有弱语义?
详细说明,这是一个按预期工作的Objective-C示例代码:
- (void)runTest {
__block NSObject *object = [NSObject new];
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
[self myMethod:object];
});
// to make sure it happens after `myMethod:` call
dispatch_async(dispatch_get_main_queue(), ^{
object = nil;
});
}
- (void)myMethod:(__weak id)arg0 {
NSLog(@"%@", arg0); // <NSObject: 0x7fb0bdb1eaa0>
sleep(1);
NSLog(@"%@", arg0); // nil
}
Run Code Online (Sandbox Code Playgroud)
这是Swift版本,但没有
public func runTest() {
var object: NSObject? = NSObject()
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)) {
self.myMethod(object)
}
dispatch_async(dispatch_get_main_queue()) {
object = nil
}
}
private func myMethod(arg0: AnyObject?) {
println("\(arg0)") //Optional(<NSObject: 0x7fc778f26cf0>)
sleep(1)
println("\(arg0)") …Run Code Online (Sandbox Code Playgroud) 出于某种原因,此示例代码有效:
NSArray *immutable = @[ @"a", @"b", @"c" ];
NSMutableArray *mutable = (__bridge id)CFPropertyListCreateDeepCopy(kCFAllocatorDefault, (__bridge CFArrayRef)immutable, kCFPropertyListMutableContainers);
Run Code Online (Sandbox Code Playgroud)
并且此代码nil由于转换而产生:
NSArray *immutable = @[ @"a", [NSNull null], @"c" ];
NSMutableArray *mutable = (__bridge id)CFPropertyListCreateDeepCopy(kCFAllocatorDefault, (__bridge CFArrayRef)immutable, kCFPropertyListMutableContainers);
Run Code Online (Sandbox Code Playgroud)
我试图找到NSNull使用此功能时不允许的任何提及.我怀疑它与方法检查财产是否可变的方式有关,但我不能用事实来支持这一点.
有任何想法吗?
objective-c core-foundation nsmutablearray nsmutabledictionary
为什么-[[NSHTTPURLResponse allHeaderFields] valueForKey:]不区分大小写,而valueForKey:对于手动创建NSDictionary则不是?
两者似乎都是NSCFDictionary;
使用变量,第一个Content-Type,即content-type,ConTEnt-TYPe返回相同的值
手动创建任何拼写的NSDictionary *a = @{ @"content-type" : @"pillows" }返回nil,然后小写"content-type"
编辑结果当下降到核心基础级别时,可以轻松实现此行为:https://gist.github.com/steipete/7739473
以下是您可以在游乐场中运行的代码示例
import Foundation
class TempNotifier {
var onChange: (Int) -> Void = {t in }
var currentTemp = 72
init() {
// 1.
onChange = { [unowned self] temp in
self.currentTemp = temp
}
// 2.
onChange = {[unowned self] temp in
self.tempHandler(temp)
}
// 3.
unowned let s = self
onChange = s.tempHandler
}
deinit {
println("deinit")
}
private func tempHandler(temp: Int) {
self.currentTemp = temp
}
}
var tN: TempNotifier? = TempNotifier()
tN = nil
Run Code Online (Sandbox Code Playgroud)
它说明了为具有潜在保留周期的块分配值的3种方法.大小写1.并且 …
objective-c ×4
swift ×3
arguments ×1
block ×1
boxing ×1
clang ×1
entitlements ×1
nsdictionary ×1
retain-cycle ×1
xcode ×1
xcode5 ×1