小编use*_*430的帖子

Swift:如何使用sizeof?

为了在使用Swift时与C API集成,我需要使用sizeof函数.在C中,这很容易.在Swift中,我处于类型错误的迷宫中.

我有这个代码:

var anInt: Int = 5
var anIntSize: Int = sizeof(anInt)
Run Code Online (Sandbox Code Playgroud)

第二行有错误"'NSNumber'不是'T.Type'的子类型".为什么这样,我该如何解决?

swift

47
推荐指数
5
解决办法
4万
查看次数

如何将CFArray转换为Swift数组?

根据Apple的"使用Swift with Cocoa和Objective-C","在Swift中,您可以互换使用每对免费桥接基础和Core Foundation类型".这使得使用Core Foundation的声音比实际更简单...

我正在尝试使用从CoreText返回的CFArray.我有这个代码:

let lines: CFArrayRef  = CTFrameGetLines(frame)
Run Code Online (Sandbox Code Playgroud)

我看到两种可能的方法来访问这个数组的成员.现在也没有为我工作.


方式#1 - 直接使用CFArray

let line: CTLineRef = CFArrayGetValueAtIndex(lines, 0)
Run Code Online (Sandbox Code Playgroud)

这会产生错误"'ConstUnsafePointer <()>',不能转换为'CTLineRef'".转换似乎不会改变此错误.

同样,我很乐意将"可互换"的行用作Swift数组,就像我说的那样.然而,

let line: CTLineRef = lines[0]
Run Code Online (Sandbox Code Playgroud)

产生错误"'CFArrayRef'没有名为'subscript'的成员"


方式#2 - 将CFArray转换为Swift数组

var linesArray: Array = [CTLineRef]()
linesArray = bridgeFromObjectiveC(lines, linesArray.dynamicType)
Run Code Online (Sandbox Code Playgroud)

在这里,我声明了一个Swift数组并将其设置为等同于桥接的CFArray.这个编译没有错误,但是当我运行它时,我在第二行遇到EXC_BREAKPOINT崩溃.也许我没有在这个上正确使用Swift语言......

core-foundation nsarray swift

22
推荐指数
3
解决办法
9778
查看次数

你如何在Swift中分配/解除不安全的指针?

使用Beta 4,我有这个代码运行良好:

var red, green, blue, alpha: UnsafePointer<CGFloat>
red = UnsafePointer<CGFloat>.alloc(1)
green = UnsafePointer<CGFloat>.alloc(1)
blue = UnsafePointer<CGFloat>.alloc(1)
alpha = UnsafePointer<CGFloat>.alloc(1)
myColor.getRed(red, green: green, blue: blue, alpha: alpha)

CGContextSetRGBStrokeColor(context, red.memory, green.memory, blue.memory, 1)

red.dealloc(1)
green.dealloc(1)
blue.dealloc(1)
alpha.dealloc(1)
Run Code Online (Sandbox Code Playgroud)

现在使用Beta5,我得到错误"'UnsafePointer.Type'没有名为'alloc'的成员".

我要做的就是根据UIColor设置CGContext的笔触颜色.我现在应该怎么做?"withUnsafePointers"函数有点儿玩笑 - 它给出了奇怪的错误,它只需要最多三个不安全的指针,而我在这种情况下尝试使用四个.

swift

11
推荐指数
2
解决办法
9838
查看次数

如何在UIPopoverController(iOS7)中防止UITableView分隔符颜色变黑?

我的应用程序使用UITableViewController,它是UINavigationController的子代,UINavigationController是UIPopoverController的内容视图控制器.我正在定制UITableViewController的UITableView的外观.它适用于iOS 5和6,但它在iOS7中存在问题.单元格的分隔符设置为白色,表格视图最初显示为正确的分隔符颜色.但是,一旦我滚动表视图并重新加载单元格(意味着调用了cellForRowAtIndexPath和willDisplayCell函数),新重新加载的单元格的分隔符都是黑色的.

我通过在UITableViewController的viewDidLoad函数中调用此函数来自定义分隔符颜色:

self.tableView.separatorColor = [UIColor whiteColor];
Run Code Online (Sandbox Code Playgroud)

如果我在应用程序的其他地方使用完全相同的表视图(而不是在UIPopoverController中),那么我没有这个问题.

据我所知,文档中没有任何内容表明这对于iOS 7而言应该与5或6不同.也许这是一个iOS错误?任何帮助将非常感激.

uitableview uipopovercontroller ios ios7

10
推荐指数
1
解决办法
3462
查看次数

未调用UIControl endTrackingWithTouch

我有一个带有轻敲手势识别器的视图.此视图的子视图是我的自定义类的实例,它继承自UIControl.我遇到一个问题,UIControl子类有时会允许触摸事件传递到父视图,而不应该.

在UIControl子类中,我重写了这些函数(代码在Swift中)

override func beginTrackingWithTouch(touch: UITouch, withEvent event: UIEvent) -> Bool
{
    return true
}

override func continueTrackingWithTouch(touch: UITouch, withEvent event: UIEvent) -> Bool
{
    // The code here moves this UIControl so its center is at the touchpoint
    return true
}

override func endTrackingWithTouch(touch: UITouch,withEvent event: UIEvent)
{
    // Something important happens here!
}
Run Code Online (Sandbox Code Playgroud)

如果用户在UIControl内触地,在拖动控制解决此系统工作得很好,两个 X和Y方向,然后升空的画面.在这种情况下,调用所有这三个函数,并发生"重要的事情".

但是,如果用户使用UIControl触摸,在X方向上拖动控件,然后从屏幕上抬起,我们就会遇到问题.调用前两个函数,但是当触点从屏幕上抬起时,调用轻击手势识别器,并且不调用endTrackingWithTouch.

如何确保始终调用endTrackingWithTouch?

uicontrol ios

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

iOS-如何衡量线程唤醒?

我有一个因“线程唤醒”过多而崩溃的应用程序。例如:

最近220秒内的45004次唤醒(平均每秒205次唤醒),超过了300秒内每秒150次唤醒的限制

这很难调试,因为我不知道直接测量线程唤醒的方法。我找到的最接近的是一个名为System Trace的Instruments模板,它将向您显示被阻止的线程事件的数量。据推测,这是密切相关的,因为阻塞的线程意味着该线程将休眠,然后在变为非阻塞状态时唤醒。

奇怪的是,当应用正常运行且不会崩溃时,被阻止的线程数在每秒10,000的范围内。我的假设是,在某些情况下,处于阻塞状态的休眠线程仅计入您的“唤醒”限制-例如,我希望由于互斥锁而被锁定的线程才有效,而操作系统在正常操作中仅转换为其他线程不会没错

如果Instruments有一个Thread Wakeups模板,这对我来说将是惊人的。我可以找到的唯一文档在这里-https : //developer.apple.com/library/content/technotes/tn2151/_index.html

异常子类型WAKEUPS表示该进程中的线程每秒被唤醒太多次,这迫使CPU非常频繁地唤醒并消耗电池寿命。

通常,这是由线程间通信(通常使用peformSelector:onThread:dispatch_async)引起的,这种通信不经意地发生的次数比应有的频繁。由于触发该异常的通讯频繁发生,因此通常会有多个后台线程具有非常相似的Backtraces(回溯) -指示通讯源自何处。

multithreading instruments ios

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

与OS X Yosemite,XCode 6.1相关的ARC相关构建失败

我有一个非ARC的项目,使用Core Data,并且在Mavericks,XCode 6.1上构建得很好.但是,当我尝试在Yosemite上使用XCode 6.1构建时,我在Core Data框架中遇到了与ARC相关的构建错误.大多数错误是:

ARC语义问题 - 指向非const类型"id"的指针,没有明确的所有权

这些发生在NSEntityDescription.h,NSFetchRequest.h,NSManagedObjectModel.h等.

我试过了:

  • 删除并重新添加Core Data框架
  • 退出并重新启动XCode(适用于我古怪的XCode错误的一半...)
  • 在运行之前运行产品 - >清洁
  • 在管理器中删除项目的派生数据
  • 检查"构建设置"中的"目标C自动引用计数"是否设置为"否"

有任何想法吗?谢谢!

xcode automatic-ref-counting xcode6 osx-yosemite

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

是 - [NSOrderedSet indexesOfObjectsPassingTest:]真的返回NSIndexSet或NSNotFound吗?

我有这个代码:

NSIndexSet *indexes = [anOrderedSet indexesOfObjectsPassingTest:^BOOL(id obj, NSUInteger idx, BOOL *stop) {
        if([self testObj: obj]) return YES;
        else return NO;
    }];

    if(indexes == NSNotFound) NSLog(@"No objects were found passing the test");
Run Code Online (Sandbox Code Playgroud)

这导致Xcode发出警告,指出"指针和整数之间的比较('NSIndexSet*'和'int')".我完全赞同Xcode.

但是,该函数的返回值是类型NSIndexSet*,Apple文档(http://developer.apple.com/library/ios/#documentation/Foundation/Reference/NSOrderedSet_Class/Reference/Reference.html)指出:

返回值
通过谓词指定的测试的有序集中对应值的索引.如果有序集中没有对象通过测试,则返回NSNotFound .."

那么当函数的返回类型是指针时,返回NSNotFound(这是一个NSInteger)的处理是NSIndexSet什么?通过将比较更改为以下来禁止警告是否安全:

if(indexes == (NSIndexSet*) NSNotFound) NSLog(@"No objects were found passing the test");
Run Code Online (Sandbox Code Playgroud)

因为从理论上讲,索引可能是一个有效的返回NSIndexSet指针,恰好指向一个等于的内存地址NSNotFound,对吗?

cocoa-touch objective-c nsorderedset

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