我最近加入了一个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实例的机会.这似乎工作得很好.
我的问题是 - 这是处理这些循环的最佳方法吗?或者有更好的方法吗?
我有一个类,我正在尝试将一些 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) 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。还有其他人遇到这个问题并设法解决吗?
我已经读了一段时间了,我不确定我找到了一个好的答案.
我正在尝试设置一个包含92个结构的数组.它是一个固定的长度,不会改变,因为它实际上是一个查找表.我认为最好的方法是首先分配内存,calloc然后加载数据.
但经过一些阅读后,我看到很多人直接分配内存而没有calloc或malloc喜欢这样
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) 我们正在为客户撰写应用程序.我们编译应用程序并向客户提供IPA,然后客户使用其配置文件和密钥重新授予应用程序.
该应用程序正常工作,直到客户辞职.然后在访问钥匙串时失败.我们在设备控制台中收到消息,如下所示:
... SecItemAdd: missing entitlement
... SecItemCopyMatching: missing entitlement
Run Code Online (Sandbox Code Playgroud)
记录我们收到的返回码-25308"所有SecItem*调用中都不允许与安全管理服务器进行交互".
我找不到任何有同样问题和解决方案的人.
初始构建和后续代码签名都有效,应用程序一直运行,直到它尝试访问钥匙串.在辞职时,客户指定了我们最初使用的相同应用ID.我也添加了和权利文件.
我注意到客户使用的配置文件中使用的应用程序ID与应用程序中的ID不同.然而,辞职的工作和应用程序运行所以我在这一点上假设它不是一个问题.
到目前为止没有运气.
有人有这个问题并解决了吗?
我一直在Xcode 7.3中编写UI测试,最近想添加一个启动参数来在应用程序中启用一些测试代码.我最初尝试设置,XCUIApplication().launchArguments因为有几个人在各种帖子中做过,但他们不会工作.
周围挖看来,两者launchArguments并launchEnvironment不能成为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)
有人遇到过这种情况么?你有工作吗?
我有一个基于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?
当我尝试运行单元测试时,我遇到了在Objective-C项目中弹出的这个可怕问题.我已经尝试了以下所有内容(根据各种SOF帖子):
我检查了控制台日志,发现了这个:
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.
任何人有什么想法接下来要尝试什么?
不确定这是否可行.但我想这样做:
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,但它是否可以做到这一点或如何做是不明显的.
有人这样做吗?
所以我认为在应用程序的主视图和设置视图之间转换会很容易。应用程序代码如下所示:
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)
当我运行应用程序并点击按钮时,两个视图按预期切换,但没有任何动画。我已经尝试了很多方法,但似乎没有任何效果,并且我在互联网上找到的所有教程都说这应该“有效”。
知道缺少什么吗?
ios ×4
objective-c ×2
swift ×2
ui-testing ×2
xcode ×2
arrays ×1
calloc ×1
code-signing ×1
cxf ×1
enums ×1
jackson ×1
json ×1
keychain ×1
memory-leaks ×1
spring ×1
struct ×1
swiftui ×1
unit-testing ×1
xerces ×1