小编dre*_*kka的帖子

处理Objective C中的无限循环

我最近加入了一个iPad项目.在查看代码库时,我遇到了一些不寻常的事情,其中​​之一就是这个(我已经对此进行了元编码):

while (something.isAlwaysTrue) {
    // Wait for something to happen. i.e. Get data from an internet connection.
    // Respond to something.
}
Run Code Online (Sandbox Code Playgroud)

在我开始对应用程序进行内存分析之前,我没有发现任何问题,并发现这些循环是大量内存泄漏.原因是因为它们永远不会结束,所以autorelease在它们内部创建的任何实例都不会被释放,因为该方法永远不会结束,并且自动释放池永远不会有机会释放.

在与编写代码的开发人员讨论之后,我提出了以下技术:

-(void) queueTask {
    // Using GCD or perform with delay, call the process method.
}

-(void) process {

    // Wait and/or do stuff. 

    [self queueTask];
}
Run Code Online (Sandbox Code Playgroud)

基本思想是通过使用方法对GCD或runloop进行排队,它为自动释放池提供了执行和清理autorelease实例的机会.这似乎工作得很好.

我的问题是 - 这是处理这些循环的最佳方法吗?或者有更好的方法吗?

memory-leaks objective-c ios

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

将 @JsonDeserialize 与 @JsonCreator 一起使用时出错

我有一个类,我正在尝试将一些 JSON 反序列化为该类。其中一个属性具有通过 @JsonDeserialize 注释附加的自定义转换器。当类使用 setter 和 setter 上的注释编写时,反序列化工作正常:

public class Rates extends AbstractResponse {

    private Date effectiveDate;
    private List<Rate> rates;

    public Rates(Date effectiveDate, List<Rate> rates) {
        this.effectiveDate = effectiveDate;
        this.rates = rates;
    }

    public Date getEffectiveDate() {
        return this.effectiveDate;
    }

    @JsonProperty("timestamp")
    public void setEffectiveDate(Date effectiveDate) {
        this.effectiveDate = effectiveDate;
    }

    @JsonDeserialize(converter = RatesTableConverter.class)
    public void setRates(List<Rate> rates) {
        this.rates = rates;
    }

    public List<Rate> getRates() {
        return this.rates;
    }
Run Code Online (Sandbox Code Playgroud)

}

但是当我把它改写成这样时:

public class Rates extends AbstractResponse {

    private final …
Run Code Online (Sandbox Code Playgroud)

json jackson deserialization

5
推荐指数
0
解决办法
1133
查看次数

访问枚举rawValue时,Swift UI测试崩溃

Xcode 7.3

开放式雷达:rdar:// 25456632

在我的应用程序中,我有一个字符串枚举,用于定义一些可访问性标识符。例如

enum AccessibilityIds:String {
    case ButtonFoo
}
Run Code Online (Sandbox Code Playgroud)

我建立了一些UI测试,我想在其中搜索控件。所以我做这样的事情:

XCUIApplication().buttons[AccessibilityIds.ButtonFoo.rawValue]
Run Code Online (Sandbox Code Playgroud)

XCode认为这很好,并且不指示任何错误。但是,当我编译UI测试时,出现此编译器错误:

Undefined symbols for architecture x86_64:
"myApp.AccessibilityIds.rawValue.getter : Swift.String", referenced from:
  (extension in myAppUITests):__ObjC.XCTestCase.fooButton (myApp.AccessibilityIds) -> Swift.Bool in TestCaseExtensions.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
Run Code Online (Sandbox Code Playgroud)

将UI测试目标与单元测试目标交叉引用(可以很好地编译并使用枚举),我发现UI测试没有设置测试主机。设置它意味着UI测试代码现在可以编译,但是测试本身随后由于SIGKILL和错误而失败:

testFooButton() encountered an error (Lost connection to test manager service. If you believe this error represents a bug, ...
Run Code Online (Sandbox Code Playgroud)

因此,看来我无法在UI测试代码中访问枚举rawValues。还有其他人遇到这个问题并设法解决吗?

enums ui-testing ios swift

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

在Objective-C中初始化一组结构

我已经读了一段时间了,我不确定我找到了一个好的答案.

我正在尝试设置一个包含92个结构的数组.它是一个固定的长度,不会改变,因为它实际上是一个查找表.我认为最好的方法是首先分配内存,calloc然后加载数据.

但经过一些阅读后,我看到很多人直接分配内存而没有callocmalloc喜欢这样

 myStruct myData[92] = { {1,2}, {3,4}, ....};
Run Code Online (Sandbox Code Playgroud)

我的第一个问题是动态分配内存是否更好?我的理解是这是一个更好的解决方案.特别是如果数据不一定会一直使用.

我的第二个问题是关于初始化数据.我曾经读过我可以初始化一个结构,... = {....};但编译器不接受它.

这是我到目前为止的代码:

typedef struct {
    int a;
    int b;
} myStruct;

@implementation MyClass

    static myStruct *myData;

    -(id) init {
         // ...

         myData = (myStruct *) calloc(92, sizeof(myStruct));
         myData[0] = {1,2}; // <=== Error ! Compiler says "Expected expression!"

         // ...
Run Code Online (Sandbox Code Playgroud)

arrays struct memory-management objective-c calloc

4
推荐指数
1
解决办法
3927
查看次数

iOS:已退出的应用无法通过安全API访问钥匙串

我们正在为客户撰写应用程序.我们编译应用程序并向客户提供IPA,然后客户使用其配置文件和密钥重新授予应用程序.

该应用程序正常工作,直到客户辞职.然后在访问钥匙串时失败.我们在设备控制台中收到消息,如下所示:

... SecItemAdd: missing entitlement
... SecItemCopyMatching: missing entitlement
Run Code Online (Sandbox Code Playgroud)

记录我们收到的返回码-25308"所有SecItem*调用中都不允许与安全管理服务器进行交互".

我找不到任何有同样问题和解决方案的人.

初始构建和后续代码签名都有效,应用程序一直运行,直到它尝试访问钥匙串.在辞职时,客户指定了我们最初使用的相同应用ID.我也添加了和权利文件.

我注意到客户使用的配置文件中使用的应用程序ID与应用程序中的ID不同.然而,辞职的工作和应用程序运行所以我在这一点上假设它不是一个问题.

到目前为止没有运气.

有人有这个问题并解决了吗?

code-signing keychain ios

4
推荐指数
1
解决办法
2794
查看次数

Xcode 7.3中的UITesting中的launchArguments无法正常工作

我一直在Xcode 7.3中编写UI测试,最近想添加一个启动参数来在应用程序中启用一些测试代码.我最初尝试设置,XCUIApplication().launchArguments因为有几个人在各种帖子中做过,但他们不会工作.

周围挖看来,两者launchArgumentslaunchEnvironment不能成为UI测试中设置好,即使API文档说,他们可以.

此外,当我尝试在UI测试方案中设置启动参数和环境变量时,它们也没有传递到应用程序,在单元测试或运行应用程序时,它们是.

这是我为证明这一点所做的快速测试的副本,所有这些测试都失败了.

import XCTest

class LaunchDebugUITests: XCTestCase {

    func testLaunchArgumentsSetting() {
        XCUIApplication().launchArguments = ["abc"]
        print("Arguments \(XCUIApplication().launchArguments)")
        XCTAssertTrue(XCUIApplication().launchArguments.contains("abc"))
    }

    func testLaunchArgumentsAppending() {
        XCUIApplication().launchArguments.append("abc")
        print("Arguments \(XCUIApplication().launchArguments)")
        XCTAssertTrue(XCUIApplication().launchArguments.contains("abc"))
    }

    func testLaunchEnvironmentSetting() {
        XCUIApplication().launchEnvironment = ["abc":"def"]
        print("Environment \(XCUIApplication().launchEnvironment)")
        XCTAssertEqual("def", XCUIApplication().launchEnvironment["abc"])
    }

    func testLaunchEnvironmentAppending() {
        XCUIApplication().launchEnvironment["abc"] = "def"
        print("Environment \(XCUIApplication().launchEnvironment)")
        XCTAssertEqual("def", XCUIApplication().launchEnvironment["abc"])
    }

} 
Run Code Online (Sandbox Code Playgroud)

有人遇到过这种情况么?你有工作吗?

xcode ui-testing ios

4
推荐指数
2
解决办法
1392
查看次数

Apache CXF的噩梦

我有一个基于Spring Framework的应用程序,我们之前已成功部署并添加了新功能.我们的开发机器是JDK6和Tomcat7.我们使用的是Spring 3.1.0.M2.旧代码使用Apache CXF 2.4.1提供Web服务并部署到我们的测试服务器上,即Tomcat 5.0和JDK5.

作为新功能的一部分,我使用此Spring Web服务客户端定义来访问外部服务

<bean id="urlWebService" class="org.springframework.remoting.jaxws.JaxWsPortProxyFactoryBean">
    <property name="serviceInterface" value="au.com.company.app.client.urlservice.UrlWebService" />
    <property name="wsdlDocumentUrl" value="http://dev.urlservice-int.services.company.com.au/v1_0/shortener?wsdl" />
    <property name="namespaceUri" value="http://urlservice.services.company.com.au/shortener" />
    <property name="serviceName" value="GenerateShortenedUrlWebServiceImplService" />
    <property name="portName" value="generateShortenedUrlWebServicePort" />
</bean>
Run Code Online (Sandbox Code Playgroud)

但是现在当我尝试部署到测试服务器上时,我得到:

Caused by: java.lang.AbstractMethodError: org.apache.xerces.dom.ElementNSImpl.setUserData(Ljava/lang/String;Ljava/lang/Object;Lorg/w3c/dom/UserDataHandler;)Ljava/lang/Object;
    at org.apache.cxf.staxutils.StaxUtils.addLocation(StaxUtils.java:1083)
    at org.apache.cxf.staxutils.StaxUtils.readDocElements(StaxUtils.java:971)
    at org.apache.cxf.staxutils.StaxUtils.readDocElements(StaxUtils.java:947)
    at org.apache.cxf.staxutils.StaxUtils.read(StaxUtils.java:874)
    at org.apache.cxf.wsdl11.WSDLManagerImpl.loadDefinition(WSDLManagerImpl.java:226)
    at org.apache.cxf.wsdl11.WSDLManagerImpl.getDefinition(WSDLManagerImpl.java:186)
    at org.apache.cxf.wsdl11.WSDLServiceFactory.<init>(WSDLServiceFactory.java:92)
    at org.apache.cxf.jaxws.ServiceImpl.initializePorts(ServiceImpl.java:203)
    at org.apache.cxf.jaxws.ServiceImpl.<init>(ServiceImpl.java:147)
    at org.apache.cxf.jaxws.spi.ProviderImpl.createServiceDelegate(ProviderImpl.java:90)
    at javax.xml.ws.Service.<init>(Service.java:56)
    at javax.xml.ws.Service.create(Service.java:697)
    at org.springframework.remoting.jaxws.LocalJaxWsServiceFactory.createJaxWsService(LocalJaxWsServiceFactory.java:125)
    at org.springframework.remoting.jaxws.JaxWsPortClientInterceptor.prepare(JaxWsPortClientInterceptor.java:334)
    at org.springframework.remoting.jaxws.JaxWsPortClientInterceptor.afterPropertiesSet(JaxWsPortClientInterceptor.java:316)
    at org.springframework.remoting.jaxws.JaxWsPortProxyFactoryBean.afterPropertiesSet(JaxWsPortProxyFactoryBean.java:42)
Run Code Online (Sandbox Code Playgroud)

我已经在这两天了,并尝试了我可以谷歌和想到的一切.Tomcat 5.0似乎已在其内存目录中安装了旧版本的Xerces,并且CXF似乎正在尝试使用.

现实是我不希望CXF涉及这个春天的客户端代码.它只是因为我无法删除的遗留代码.我无法想办法让CXF忽略这个客户端.我无法升级服务器和JDK,或删除旧的Xerces.我试图包含更高版本的Xerces以及各种其他XML API,希望CXF能够开始使用其中一个而不是Xerces,我尝试过任何可以找到的配置类型更改.但到目前为止没有任何作用

有没有人知道如何(a)阻止CXF将它挂钩到这个bean?或者(b)告诉CXF至少不要使用过时的Xerces?

spring cxf xerces

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

XCode:代码覆盖率数据生成失败

当我尝试运行单元测试时,我遇到了在Objective-C项目中弹出的这个可怕问题.我已经尝试了以下所有内容(根据各种SOF帖子):

  • 清除派生数据
  • 删除〜/ Library中的所有模拟器设置
  • 重新启动XCode
  • 重启MBP
  • 多次重置模拟器
  • 换到不同的模拟器(即使是我从未使用过的模拟器)

我检查了控制台日志,发现了这个:

  26/06/2016 9:20:10.973 PM com.apple.debugserver-@(#)PROGRAM:debugserver  PROJECT:debugserver-350.0.21.9
  [7768]: 1 +0.000000 sec [1e58/1003]: error: ::read ( 3, 0x700000080a40, 1024 ) => -1 err = Bad file descriptor (0x00000009)
Run Code Online (Sandbox Code Playgroud)

我不是在使用Cocoapods.

任何人有什么想法接下来要尝试什么?

xcode unit-testing

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

Swift:具有局部变量注入的动态字符串

不确定这是否可行.但我想这样做:

let version = "2.0.1"
let year = 2017
let version = "Build \(version), \(year)"
Run Code Online (Sandbox Code Playgroud)

但是,我想从本地化文件中获取版本字符串.即.

let version = "2.0.1"
let year = 2017
let versionTemplate = NSLocalizedString("version.template", comment:"")
let version = ???? // Something done with versionTemplate
Run Code Online (Sandbox Code Playgroud)

我已经看过了使用NSExpression,但它是否可以做到这一点或如何做是不明显的.

有人这样做吗?

nslocalizedstring swift

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

SwiftUI:在 WindowGroup 中的两个视图之间设置动画转换不起作用

所以我认为在应用程序的主视图和设置视图之间转换会很容易。应用程序代码如下所示:

struct PointsMasterII: App {

    @StateObject var settings = AppSettings()

    var body: some Scene {
        WindowGroup {
            if settings.displaySettings {
                SettingsView()
                    .environmentObject(settings)
                    .transition(.slide)
            } else {
                ContentView()
                    .environmentObject(settings)
                    .transition(.slide)
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

这是非常基本的,在每个视图中我都定义了以下按钮:


@EnvironmentObject private var settings: AppSettings

var body: some View {

    // ...

    Button {
        withAnimation {
            settings.displaySettings.toggle()
        }
    } label: {
        Image(systemName: "gearshape.2").font(.title)
    }
}
Run Code Online (Sandbox Code Playgroud)

当我运行应用程序并点击按钮时,两个视图按预期切换,但没有任何动画。我已经尝试了很多方法,但似乎没有任何效果,并且我在互联网上找到的所有教程都说这应该“有效”。

知道缺少什么吗?

swiftui

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