为了在使用Swift时与C API集成,我需要使用sizeof函数.在C中,这很容易.在Swift中,我处于类型错误的迷宫中.
我有这个代码:
var anInt: Int = 5
var anIntSize: Int = sizeof(anInt)
Run Code Online (Sandbox Code Playgroud)
第二行有错误"'NSNumber'不是'T.Type'的子类型".为什么这样,我该如何解决?
根据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语言......
使用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"函数有点儿玩笑 - 它给出了奇怪的错误,它只需要最多三个不安全的指针,而我在这种情况下尝试使用四个.
我的应用程序使用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错误?任何帮助将非常感激.
我有一个带有轻敲手势识别器的视图.此视图的子视图是我的自定义类的实例,它继承自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?
我有一个因“线程唤醒”过多而崩溃的应用程序。例如:
最近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(回溯) -指示通讯源自何处。
我有一个非ARC的项目,使用Core Data,并且在Mavericks,XCode 6.1上构建得很好.但是,当我尝试在Yosemite上使用XCode 6.1构建时,我在Core Data框架中遇到了与ARC相关的构建错误.大多数错误是:
ARC语义问题 - 指向非const类型"id"的指针,没有明确的所有权
这些发生在NSEntityDescription.h,NSFetchRequest.h,NSManagedObjectModel.h等.
我试过了:
有任何想法吗?谢谢!
我有这个代码:
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,对吗?
ios ×3
swift ×3
cocoa-touch ×1
instruments ×1
ios7 ×1
nsarray ×1
nsorderedset ×1
objective-c ×1
osx-yosemite ×1
uicontrol ×1
uitableview ×1
xcode ×1
xcode6 ×1