小编Aar*_*man的帖子

Objective-C中的递归块在ARC中泄漏

所以我正在使用递归块.我理解,对于要递归的块,它需要以__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

15
推荐指数
1
解决办法
3724
查看次数

Swift:传递类型作为参数

是否可以在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本身,所以我可以在函数体中检查该类型.

types functional-programming swift

14
推荐指数
1
解决办法
4494
查看次数

Swift Struct with Lazy,私有属性符合Protocol

首先,我有一个协议,只定义了一些readonly属性,例如:

protocol Example {
  var var1:String { get }
  var varArray:[String] { get }
}
Run Code Online (Sandbox Code Playgroud)

然后我想创建一个符合该协议的结构.我遇到的问题是,我有两个相互矛盾的要求:

  1. 属性需要延迟生成.
  2. 属性是相关的,需要一起生成.

我似乎找不到办法做到这一点.我最接近的是这样的:

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是在主线程上创建的,但是值将由后一个进程完全在后台线程上生成.

更新

因此我向我指出,我可以 …

struct protocols lazy-evaluation swift

11
推荐指数
1
解决办法
4404
查看次数

Apple LLVM编译器3.1错误

刚刚将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)

xcode exit-code clang

10
推荐指数
2
解决办法
2万
查看次数

superview的手势是否应取消iOS 7中子视图的手势?

几年来我一直在假设如果超视图及其子视图都具有手势识别器,子视图将首先接收触摸并取消超视图的手势.直到iOS 7,这个假设从未让我失望,允许我向子视图添加手势,确信superview的手势不会干扰.但是在iOS 7中,超级视图将首先随机接收触摸并取消子视图的手势.这种情况很少发生,这使问题难以发现.

我第一次经历这个问题,因为按钮无法UITapGestureRecognizer再次使用...,很少.通常按钮会工作,直到它们没有.让你有点质疑你的理智.所以我自己动手TapGestureRecognizer,发现superview水龙头有时会取消他们的子视频水龙头.它在任何以前版本的iOS中都没有这样做,但我想知道这种行为是否从未被承诺过.

我认为子视图的手势应该取消它的superview的手势(除非委托另有指定).这是错的还是这个错误?

请注意:我不是问如何处理这种情况.我问是否有人知道我的假设是否不正确.我已经重新安排视图,动态添加/删除手势,并创建相当复杂的实现gestureRecognizer:shouldReceiveTouch:来纠正这种情况.这不好玩,但我可以解决这个问题.

touch-event uigesturerecognizer ios ios7

9
推荐指数
1
解决办法
4310
查看次数

在Core Graphics中斜切路径/形状

我正试图在核心图形中斜切路径.有没有人已经为任意形状做过这个,如果是这样,他们是否愿意共享代码?

我在下面列出了我的实现.我用三个变量来确定伞:CGFloat bevelSize,UIColor highlightColor,UIColor shadow.请注意,光源的角度始终为135度.我还没有完成这个,但这里基本上是我要做的,分成两部分.第一部分,产生焦点:

  1. 我找到了路径中每条相邻线之间角度的平分线.
  2. 对于弧,平分线是垂直于由弧的两个端点产生的线的线,源自中点.这应该照顾使用电弧的大多数情况.我不拿弧线和线的平分线.在这些情况下,弧平分线应该可以正常工作.
  3. 然后,我根据每个相邻平分线的交点计算焦点.
  4. 如果焦点位于其使用的形状内,否则将被丢弃.

产生焦点的目的是按比例"缩小"形状.

第二部分有点复杂.我必须创建斜面形状的每个边/部分.我这样做是通过bevelSize沿着从最近的焦点延伸到所讨论的点的线的半径来绘制(由)原始形状的每个点.当我有两个连续的'bevelPoints'时,我创建了一个UIBezierPath,它从bevelPoints延伸到原始点并返回到bevelPoints(注意,这包括弧).这会创建一个我可以用来填充的"边/段".在直边,我只是填充阴影或高光颜色,取决于侧面的角度.对于弧,我确定弧度'弧'.如果该弧包含一个过渡角(M_PI_4或M_PI + M_PI_4),我用渐变填充它(从阴影到高光或高亮到阴影,这是合适的).否则我用纯色填充它.

更新

我把我的答案(见下文)分成了一个单独的博文.我不再使用您在上面看到的实现细节,但我将其全部保留在那里以供参考.我希望这可以帮助其他人使用Core Graphics.

core-graphics objective-c shape uibezierpath

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

有条件地隐藏编译器中的代码

所以这就是问题所在.我将很快发布针对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不会自动完成. …

objective-c clang ios

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

迭代Vimscript中的字符串或解析JSON文件

所以我正在创建一个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秒来处理,这是不可接受的. …

string vim parsing json

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

Swift内存管理:在var中存储func

我正在寻找将函数存储为其他对象变量的最佳实践.具体来说,我希望避免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)

memory-management retain-cycle swift

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

init中的Swift通用约束

我有泛型,我希望能够使用特定的约束来初始化它.约束仅用于初始化.班上的其他人都不在乎.这是一个简化的例子:

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)

generics init swift

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