所以我正在使用递归块.我理解,对于要递归的块,它需要以__block关键字开头,并且必须将其复制,以便将其放在堆上.但是,当我这样做时,它显示为仪器中的泄漏.有谁知道为什么或如何绕过它?
请注意,在下面的代码中,我已经引用了许多其他块,但它们都不是递归的.
__block NSDecimalNumber *(^ProcessElementStack)(LinkedList *, NSString *) = [^NSDecimalNumber *(LinkedList *cformula, NSString *function){
LinkedList *list = [[LinkedList alloc] init];
NSDictionary *dict;
FormulaType type;
while (cformula.count > 0) {
dict = cformula.pop;
type = [[dict objectForKey:@"type"] intValue];
if (type == formulaOperandOpenParen || type == formulaListOperand || type == formulaOpenParen) [list add:ProcessElementStack(cformula, [dict objectForKey:@"name"])];
else if (type == formulaField || type == formulaConstant) [list add:NumberForDict(dict)];
else if (type == formulaOperand) [list add:[dict objectForKey:@"name"]];
else if (type == formulaCloseParen) {
if (function){ …Run Code Online (Sandbox Code Playgroud) objective-c instruments objective-c-blocks automatic-ref-counting
是否可以在Swift中传入Type作为函数参数?注意:我不想传入指定类型的对象,而是传递Type本身.例如,如果我想复制Swift的as?功能:
infix operator <-? { associativity left }
func <-? <U,T>(x:U?, t:T) -> T? {
if let z = x as? t {
return z
}
}
}
Run Code Online (Sandbox Code Playgroud)
当然,t作为一个类型传入,但我想传递Type本身,所以我可以在函数体中检查该类型.
首先,我有一个协议,只定义了一些readonly属性,例如:
protocol Example {
var var1:String { get }
var varArray:[String] { get }
}
Run Code Online (Sandbox Code Playgroud)
然后我想创建一个符合该协议的结构.我遇到的问题是,我有两个相互矛盾的要求:
我似乎找不到办法做到这一点.我最接近的是这样的:
struct AStruct : Example {
private lazy var data:(var1:String, varArray:[String]) = {
var stringValue:String = ""
var stringArray:[String] = []
//Generate data
return (stringValue, stringArray)
}()
var var1:String {
return self.data.var1
}
var varArray:[String] {
return self.data.varArray
}
}
Run Code Online (Sandbox Code Playgroud)
问题是,我收到了错误:Immutable value of type 'AStruct' only has mutating members named 'data'.
有谁知道我可以实现目标的方式?从技术上讲,data变量是可变的,但永远不会改变.我不能使用let,lazy所以我无法指定一旦生成后该值永远不会改变.我需要生成值,因为struct是在主线程上创建的,但是值将由后一个进程完全在后台线程上生成.
因此我向我指出,我可以 …
刚刚将Xcode更新为4.3,现在我无法构建我的应用程序.我收到这个错误:
Command /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang failed with exit code 254
Run Code Online (Sandbox Code Playgroud)
还有其他人有这个问题吗?它可能只是一个编译设置,但我不知道在哪里看.
当然,错误包括整个堆栈转储,但为了简洁起见,我没有包括它.我希望有人知道"退出代码254"是什么.尝试搜索它但找不到任何东西.
这是整个输出:
CompileC /Users/aaron/Library/Developer/Xcode/DerivedData/iDB-cvvkmobzsecywdherzjesrjswdng/Build/Intermediates/iDB.build/Debug-iphonesimulator/Flexile.build/Objects-normal/i386/SCheckBox.o iDB/SCheckBox.m normal i386 objective-c com.apple.compilers.llvm.clang.1_0.compiler
cd "/Users/aaron/Dropbox/XCode Projects/iDB"
setenv LANG en_US.US-ASCII
setenv PATH "/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/usr/bin:/Applications/Xcode.app/Contents/Developer/usr/bin:/usr/bin:/bin:/usr/sbin:/sbin"
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang -x objective-c -arch i386 -fmessage-length=0 -std=gnu99 -fobjc-arc -Wno-trigraphs -fpascal-strings -O0 -Werror -Wno-missing-field-initializers -Wmissing-prototypes -Wreturn-type -Wno-implicit-atomic-properties -Wformat -Wno-missing-braces -Wparentheses -Wswitch -Wunused-function -Wunused-label -Wno-unused-parameter -Wunused-variable -Wunused-value -Wno-uninitialized -Wno-unknown-pragmas -Wno-shadow -Wno-four-char-constants -Wno-sign-compare -Wno-shorten-64-to-32 -Wpointer-sign -Wno-newline-eof -Wno-selector -Wno-strict-selector-match -Wno-undeclared-selector -Wno-deprecated-implementations -DDEBUG=1 -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator5.0.sdk -fexceptions -fasm-blocks -Wprotocol -Wdeprecated-declarations -mmacosx-version-min=10.6 -g -Wno-conversion -Wno-sign-conversion -fobjc-abi-version=2 -fobjc-legacy-dispatch "-DIBOutlet=__attribute__((iboutlet))" "-DIBOutletCollection(ClassName)=__attribute__((iboutletcollection(ClassName)))" "-DIBAction=void)__attribute__((ibaction)" …Run Code Online (Sandbox Code Playgroud) 几年来我一直在假设如果超视图及其子视图都具有手势识别器,子视图将首先接收触摸并取消超视图的手势.直到iOS 7,这个假设从未让我失望,允许我向子视图添加手势,确信superview的手势不会干扰.但是在iOS 7中,超级视图将首先随机接收触摸并取消子视图的手势.这种情况很少发生,这使问题难以发现.
我第一次经历这个问题,因为按钮无法UITapGestureRecognizer再次使用...,很少.通常按钮会工作,直到它们没有.让你有点质疑你的理智.所以我自己动手TapGestureRecognizer,发现superview水龙头有时会取消他们的子视频水龙头.它在任何以前版本的iOS中都没有这样做,但我想知道这种行为是否从未被承诺过.
我认为子视图的手势应该取消它的superview的手势(除非委托另有指定).这是错的还是这个错误?
请注意:我不是问如何处理这种情况.我问是否有人知道我的假设是否不正确.我已经重新安排视图,动态添加/删除手势,并创建相当复杂的实现gestureRecognizer:shouldReceiveTouch:来纠正这种情况.这不好玩,但我可以解决这个问题.
我正试图在核心图形中斜切路径.有没有人已经为任意形状做过这个,如果是这样,他们是否愿意共享代码?
我在下面列出了我的实现.我用三个变量来确定伞:CGFloat bevelSize,UIColor highlightColor,UIColor shadow.请注意,光源的角度始终为135度.我还没有完成这个,但这里基本上是我要做的,分成两部分.第一部分,产生焦点:
产生焦点的目的是按比例"缩小"形状.
第二部分有点复杂.我必须创建斜面形状的每个边/部分.我这样做是通过bevelSize沿着从最近的焦点延伸到所讨论的点的线的半径来绘制(由)原始形状的每个点.当我有两个连续的'bevelPoints'时,我创建了一个UIBezierPath,它从bevelPoints延伸到原始点并返回到bevelPoints(注意,这包括弧).这会创建一个我可以用来填充的"边/段".在直边,我只是填充阴影或高光颜色,取决于侧面的角度.对于弧,我确定弧度'弧'.如果该弧包含一个过渡角(M_PI_4或M_PI + M_PI_4),我用渐变填充它(从阴影到高光或高亮到阴影,这是合适的).否则我用纯色填充它.
更新
我把我的答案(见下文)分成了一个单独的博文.我不再使用您在上面看到的实现细节,但我将其全部保留在那里以供参考.我希望这可以帮助其他人使用Core Graphics.
所以这就是问题所在.我将很快发布针对iOS的更新,以解决iOS 7中的一些问题.为此,我需要使用一些特定的iOS 7功能/类型.我已经绝对肯定iOS 7代码只会在iOS 7上执行并且回退到iOS 7之前的不同代码.当然,我不允许使用当前的Xcode beta提交,所以我正在尝试编译与当前的Xcode版本一起发布.但是,我似乎找不到禁用此特定警告的方法:
Use of undeclared identifier '<Redacted>'.
有没有人知道使用a禁用此警告的方法#pragma.我尝试了很多不同的包括
-w,-Weverthing,-Wall
但似乎没什么用.
更新
答案:当然,你不能,因为编译器无法编译它一无所知的标识符.我的解决方案是简单地创建一个#define:
#define <redacted> 1
更新2
下面的答案实际上使它更容易.我已经创建了一个#define Xcode5Code(code, alt)允许我有条件地执行代码块的东西.通过@maddy使用解决方案修改它:
#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 70000
#define Xcode5Code(code, alt) code
#else
#define Xcode5Code(code, alt) alt
#endif
Run Code Online (Sandbox Code Playgroud)
这允许我通过使用以下方法轻松地隐藏编译器中的代码块:
Xcode5Code({
//Code to be execute only with Xcode 5
}, {
//code to be executed in previous versions of Xcode
})
Run Code Online (Sandbox Code Playgroud)
使用它的主要好处#define Xcode5Code是Xcode会为你自动完成它,这比使用#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 70000Xcode 完全容易,Xcode不会自动完成. …
所以我正在创建一个vim脚本,需要将JSON文件加载并解析为本地对象图.我搜索过,我找不到任何本地方式来处理JSON文件,我不想在脚本中添加任何依赖项.所以我编写了自己的函数来解析JSON字符串(从文件中获取),但它确实很慢.目前,我遍历文件中的每个字符,如下所示:
let len = strlen(jsonString) - 1
let i = 0
while i < len
let c = strpart(jsonString, i, 1)
let i += 1
" A lot of code to process file....
" Note: I've tried short cutting the process by searching for enclosing double-quotes when I come across the initial double quotes (also taking into account escaping '\' character. It doesn't help
endwhile
Run Code Online (Sandbox Code Playgroud)
我也尝试过这种方法:
for c in split(jsonString, '\zs')
" Do a lot of parsing ....
endfor
Run Code Online (Sandbox Code Playgroud)
作为参考,具有~29,000个字符的文件需要大约4秒来处理,这是不可接受的. …
我正在寻找将函数存储为其他对象变量的最佳实践.具体来说,我希望避免self在函数中捕获中固有的保留周期.
来自objective-c和blocks,我通常会这样做:
__weak id _self = self;
iVar.someBlock = ^{
[_self doSomething];
};
Run Code Online (Sandbox Code Playgroud)
当然,iVar该类会复制块并存储它.没有保留周期因为我已经捕获了__weak id _self.
在Swift中,我不太确定,特别是因为我可以传递类函数/方法.所以,让我们在iVar课堂上说:
class iVarClass {
var callBack:() -> ()?
func jumpUpAndDown(){
//Weeeeeee!
self.callBack?()
}
}
Run Code Online (Sandbox Code Playgroud)
现在在我的"main"类中,我有一个上面类的实例变量,我这样做:
class mainClass {
var iVar: iVarClass
init(iVar:iVarClass){
self.iVar = iVar
iVar.callback = self.doSomething
}
func doSomething(){
self.iVar.jumpUpAndDown?()
}
}
Run Code Online (Sandbox Code Playgroud)
我们这里有保留周期吗?我会这么认为,我想也许我需要做出callback弱点:
weak var callBack:() -> ()?
Run Code Online (Sandbox Code Playgroud)
当然,我可以在主类中做这样的事情:
init(iVar:iVarClass){
self.iVar = iVar
weak var _self = self
iVar.callback = {
_self?.doSomething() …Run Code Online (Sandbox Code Playgroud) 我有泛型,我希望能够使用特定的约束来初始化它.约束仅用于初始化.班上的其他人都不在乎.这是一个简化的例子:
struct Generic<T> {
let compare: (T, T) -> Bool
init<T: Equatable>(data: [T]) {
let handler: (T, T) -> Bool = { $0 == $1 }
compare = handler
insert(data)
}
init(compareHandler: (T, T) -> Bool, data[T]) {
compare = self.compareHandler
insert(data)
}
}
Run Code Online (Sandbox Code Playgroud)
你可以看到有两个初始化器.第二个显然工作正常.但是,在第一个中,本地类型T与struct的泛型类型不匹配.因此,例如,尝试插入我得到的数据Cannot invoke 'insert' with an argument list of type '([T])'.我是否可以仅针对初始化或特定函数专门化Struct的泛型类型?
请注意,我已经尝试init<T where T:Equatable>(data: [T])过同样的效果.
我正在使用以下解决方法:我创建一个顶级函数并删除专用的init:
func equatableHandler<T: Equatable>(left: T, right: T) -> Bool {
return left == right
} …Run Code Online (Sandbox Code Playgroud) swift ×4
objective-c ×3
clang ×2
ios ×2
exit-code ×1
generics ×1
init ×1
instruments ×1
ios7 ×1
json ×1
parsing ×1
protocols ×1
retain-cycle ×1
shape ×1
string ×1
struct ×1
touch-event ×1
types ×1
uibezierpath ×1
vim ×1
xcode ×1