小编Sas*_*ats的帖子

在传递给方法时,将相同的枚举成员装箱会生成一个更大的整数

我正在使用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 …

boxing objective-c clang objective-c-literals

7
推荐指数
1
解决办法
601
查看次数

Objective-C - 现有代码库的Swift桥接性能

对于具有将swift添加到现有Objective-C代码库中的经验的开发人员而言,这是一个性能问题.

我的前提是:最终Bridging-Header.h可能变得非常大(它可能最终包含所有1.5k存在的Objective-C类(给予或接受那些不能从Swift访问的类)),反之亦然PRODUCT-Swift.h生成头.

我担心编译性能可能会急剧下降:每次包含的.h类都发生变化时,都必须重新编译所有.swift文件.

是这样的吗?如果是这样,有没有办法优化性能?

澄清:想象一下,您将整个项目类包含到.pch文件中,现在每个类更改都会触发整个项目的重新编译.这种方式类似Bridging-Header.h吗?

objective-c swift objective-c-swift-bridge

7
推荐指数
1
解决办法
425
查看次数

从Xcode功能中提取权利

我需要在构建项目时自动获取Xcode生成的权利文件.

通常(即使您没有选择任何明确的功能),您可以找到一个$DERIVED_FILES_DIR/$PRODUCT_NAME.xcent,它包含有关您的团队和钥匙串访问的一般信息.

有没有人知道绕过构建阶段生成它的方法.我想弄清楚与指定显式授权文件或使用功能窗格指定它们的事实无关的流程.

也许我错过了一些明显的东西,任何信息都会非常感激.

xcode entitlements code-signing-entitlements xcode5

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

弱方法论证语义

有没有办法指定特定方法参数具有弱语义?

详细说明,这是一个按预期工作的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)

arguments weak-references automatic-ref-counting swift

6
推荐指数
3
解决办法
5162
查看次数

CFPropertyListCreateDeepCopy无法处理包含NSNull的数组/字典

出于某种原因,此示例代码有效:

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

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

NSHTTPURLResponse allHeaderFields区分大小写

为什么-[[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

objective-c nsdictionary key-value-observing

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

在swift中使用函数作为块时,避免保留周期

以下是您可以在游乐场中运行的代码示例

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.并且 …

weak-references block retain-cycle swift

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