小编Ber*_*rgP的帖子

如何从 didFailProvisionalNavigation 方法获取失败的 URL

我正在尝试为我的 Web 视图显示错误消息,并且我需要知道不可用的 url,因此我实现了委托方法:

- (void)webView:(WKWebView *)webView didFailProvisionalNavigation:(WKNavigation *)navigation withError:(NSError *)error {
    [self.addressBar finishLoadingProgressAnimated:YES];
    NSLog(@"%@", webView.URL);
    [self showErrorPageForURL:error.userInfo[NSErrorFailingURLStringKey]];
}
Run Code Online (Sandbox Code Playgroud)

但是 NSErrorFailingURLStringKey 已被弃用,那么如何获取失败的 URL?WKNavigation的界面是空的。此时 webView.URL == nil 。

iphone nsurl ios wkwebview

5
推荐指数
2
解决办法
6437
查看次数

对类对象使用objc_setAssociatedObject是否正确?

objc_setAssociatedObject用于类对象是否正确?

我们经常使用类似的静态变量来模拟类变量: Objective C Static Class Level变量 但是,我们可以使用Associated对象作为替代吗?

objc_setAssociatedObject([self class], &STRING_KEY, myString, OBJC_ASSOCIATION_RETAIN);
Run Code Online (Sandbox Code Playgroud)

static class objective-c static-variables ios

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

如何从目标文件(Mach-o)获取SEL(@selector())?SEL如何存储在Mach-o中?

从objc来源我们可以看到SEL定义为typedef struct objc_selector *SEL;

我用idaq反汇编我的dylib ,并且我确实调用了_MSHookMessageEx函数,它是从libsubstrate.dylib链接的

_MSHookMessageEx 有以下签名

void MSHookMessageEx(Class class, SEL selector, IMP replacement, IMP *result);
Run Code Online (Sandbox Code Playgroud)

所以我们可以假设在源代码中有类似@selector(someMethod:)第二个参数的东西

在目标文件的数据部分,我可以看到源代码中使用的所有CFStrings

在此输入图像描述

但是这里没有任何选择器字符串,所以我们可以看到它@selector()没有转换成静态CFString

我很感兴趣找到传递给_MSHookMessageEx函数的选择器和类的String表示.

如何从目标文件(Mach-o)获取SEL(@selector())?SEL如何存储在Mach-o中?

谢谢!

更新:

我确实在调用方法之前在ida方法表示中有一些字符串

在此输入图像描述

我猜有些选择器传入函数.我对吗?

iphone reverse-engineering objective-c ida cydia-substrate

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

为什么MKCircle不会显示在MKMapView iOS8上

我创建了这样的新叠加层:

MKCircle *circle = [MKCircle circleWithCenterCoordinate:region.coordinate radius:region.radius];
[self.mapView addOverlay:circle];
Run Code Online (Sandbox Code Playgroud)

我也实现了委托方法:

- (MKOverlayRenderer *)mapView:(MKMapView *)mapView rendererForOverlay:(id<MKOverlay>)overlay {
    MKCircleRenderer *circleRenderer = [[MKCircleRenderer alloc] init];
    circleRenderer.fillColor = [UIColor greenColor];
    circleRenderer.alpha = 1.f;
    return circleRenderer;
}
Run Code Online (Sandbox Code Playgroud)

代码的两个部分都被调用了,mapView!= nil当时,它是委托集,但是我在地图上看不到圆圈.

我究竟做错了什么?

iphone mapkit mkmapview ios

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

IBInspectable UIView属性

我可以让我的UIView @property可以检查吗?

@interface Superview : UIView 
    @property (nonatomic, weak, readonly) IBInspectable UIButton *stopButton;
    @property (nonatomic, weak, readonly) IBInspectable PKCircleProgressView *circleProgressView;
@end
Run Code Online (Sandbox Code Playgroud)

我已经创建了一个可设计的视图PKCircleProgressView,我希望它可以从IB编辑.此外,我创建了另一个可设计的视图,其中包含PKCircleProgressView作为子视图,我希望它也可以编辑.

如果我在IB中使用Superview,有没有办法编辑circleProgressView的属性?

我只想出一个想法,为两个视图创建一个通用协议,并实现如下方法:

- (void)setProgress:(CGFloat)progress {
    self.circleProgressView.progress = progress;
}
Run Code Online (Sandbox Code Playgroud)

但是对每个属性都不容易,特别是如果我想创建另一个包含我的Superview的View.

interface-builder uiview ios ibdesignable

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

魔法记录,无法保存对象:contextDidSave == NO,error = nil

我正试图坚持新的实体:

- (void)updateStorageWithQuizzess:(NSArray *)quizzess completion:(void(^)(NSArray *quizzess, BOOL succes, NSError *error))completion {
    NSMutableArray *mutableArray = [NSMutableArray array];

    [Quiz MR_truncateAll];
    [[NSManagedObjectContext MR_context] MR_saveWithBlock:^(NSManagedObjectContext *localContext) {

        for (NSDictionary *dictionary in quizzess) {
            Quiz *quiz = [Quiz MR_createEntity];
            [quiz fromDictionary:dictionary];
            [mutableArray addObject:quiz];
        }
    } completion:^(BOOL contextDidSave, NSError *error) {
        BlockSafeRun(completion, mutableArray, contextDidSave, error);
    }];
}
Run Code Online (Sandbox Code Playgroud)

或者像这样:

- (void)updateStorageWithQuizzess:(NSArray *)quizzess completion:(void(^)(NSArray *quizzess, BOOL succes, NSError *error))completion {
    NSMutableArray *mutableArray = [NSMutableArray array];

    [Quiz MR_truncateAll];

    [MagicalRecord saveWithBlock:^(NSManagedObjectContext *localContext) {
        for (NSDictionary *dictionary in quizzess) {
            Quiz …
Run Code Online (Sandbox Code Playgroud)

iphone core-data objective-c ios magicalrecord

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

ios:如何检测语音听写是否用于UITextField?或者在键盘上轻敲麦克风按钮

如何检测UITextField是否使用了语音听写?或者在键盘上轻敲麦克风按钮.有没有办法做到这一点?

在此输入图像描述

iphone keyboard uiview voice-recognition ios

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

使用Grand Central Dispatch(GCD)创建完全N个线程

我知道我可以dispatch_async和和异步执行任务dispatch_get_global_queue.

但dispatch_async创建了多少个线程?我该怎么做才能用GCD执行完全N(不多也不少)的线程,并对它们执行一些任务?执行任务后,我需要在已发布的线程中添加新任务,可能在前一任务的complitation块中.

或者也许我可以控制荆棘的数量NSOperationQueue?我知道它有属性maxConcurrentOperationCount,但它只控制任务的最大限制.那么,我可以确定NSOperationQueue创建了不少于8个线程,以防我设置maxConcurrentOperationCount = 8并将12个操作添加到NSOperationQueue

非常感谢你!

iphone multithreading asynchronous grand-central-dispatch ios

2
推荐指数
1
解决办法
1234
查看次数

如何将X509结构转换为String?

我有指向X509结构的指针,我想将它转换为字符串,我该怎么做?我需要得到像PEM_write_X509函数中打印的字符串.

-----BEGIN CERTIFICATE-----
MIIIxjCCB66gAwIBAgIKah4k3wAAAAC/WTANBgkqhkiG9w0BAQUFADBbMRIwEAYK
CZImiZPyLGQBGRYCcnUxFjAUBgoJkiaJk/IsZAEZFgZ5YW5kZXgxEjAQBgoJkiaJ
k/IsZAEZFgJsZDEZMBcGA1UEAxMQWWFuZGV4RXh0ZXJuYWxDQTAeFw0xMjA5MDQx
NDEzMDhaFw0xNDAxMTcxNTE1NDZaMIGQMQswCQYDVQQGEwJSVTEPMA0GA1UECBMG
UnVzc2lhMQ8wDQYDVQQHEwZNb3Njb3cxDzANBgNVBAoTBllhbmRleDEMMAoGA1UE
CxMDSVRPMRQwEgYDVQQDEwtZYW5kZXggU2VycDEqMCgGCSqGSIb3DQEJARYbc2Vh
cmNoLWFkbWluQHlhbmRleC10ZWFtLnJ1MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCB
iQKBgQDBXfluaCox4R4D2Y/3mc6O9i3koHtGtHZmZjYm7XdsAA5xsOZAonLReJCL
J8BtgS6McmX9cGa9GF9ErxfWODC+1Wb3yayUNzOhr2ICu3T++ttf0aMVvMTeDF/Y
lfoZ+tgg1ITQ9yVtz7eteodjLNAy6AaC0z7ulSq4jvPbm1WuBQIDAQABo4IF2DCC
BdQwDAYDVR0TAQH/BAIwADALBgNVHQ8EBAMCBaAwggRbBgNVHREEggRSMIIEToIJ
eWFuZGV4LmJ5ggp5YW5kZXguY29tgg15YW5kZXguY29tLnRygg15YW5kZXguY29t
LnVhggl5YW5kZXgua3qCC3lhbmRleC5tb2Jpggp5YW5kZXgubmV0ggl5YW5kZXgu
cnWCCXlhbmRleC5zdIIJeWFuZGV4LnVhghBpbWFnZXMueWFuZGV4LmJ5ghFpbWFn
ZXMueWFuZGV4LmNvbYIUaW1hZ2VzLnlhbmRleC5jb20udHKCFGltYWdlcy55YW5k
ZXguY29tLnVhghBpbWFnZXMueWFuZGV4Lmt6ghJpbWFnZXMueWFuZGV4Lm1vYmmC
EWltYWdlcy55YW5kZXgubmV0ghBpbWFnZXMueWFuZGV4LnJ1ghBpbWFnZXMueWFu
ZGV4LnN0ghBpbWFnZXMueWFuZGV4LnVhghBwZW9wbGUueWFuZGV4LmJ5ghFwZW9w
bGUueWFuZGV4LmNvbYIUcGVvcGxlLnlhbmRleC5jb20udHKCFHBlb3BsZS55YW5k
ZXguY29tLnVhghBwZW9wbGUueWFuZGV4Lmt6ghJwZW9wbGUueWFuZGV4Lm1vYmmC
EXBlb3BsZS55YW5kZXgubmV0ghBwZW9wbGUueWFuZGV4LnJ1ghBwZW9wbGUueWFu
ZGV4LnN0ghBwZW9wbGUueWFuZGV4LnVhghZwZW9wbGVzZWFyY2gueWFuZGV4LmJ5
ghdwZW9wbGVzZWFyY2gueWFuZGV4LmNvbYIacGVvcGxlc2VhcmNoLnlhbmRleC5j
b20udHKCGnBlb3BsZXNlYXJjaC55YW5kZXguY29tLnVhghZwZW9wbGVzZWFyY2gu
eWFuZGV4Lmt6ghhwZW9wbGVzZWFyY2gueWFuZGV4Lm1vYmmCF3Blb3BsZXNlYXJj
aC55YW5kZXgubmV0ghZwZW9wbGVzZWFyY2gueWFuZGV4LnJ1ghZwZW9wbGVzZWFy
Y2gueWFuZGV4LnN0ghZwZW9wbGVzZWFyY2gueWFuZGV4LnVhgg92aWRlby55YW5k
ZXguYnmCEHZpZGVvLnlhbmRleC5jb22CE3ZpZGVvLnlhbmRleC5jb20udHKCE3Zp
ZGVvLnlhbmRleC5jb20udWGCD3ZpZGVvLnlhbmRleC5reoIRdmlkZW8ueWFuZGV4
Lm1vYmmCEHZpZGVvLnlhbmRleC5uZXSCD3ZpZGVvLnlhbmRleC5ydYIPdmlkZW8u
eWFuZGV4LnN0gg92aWRlby55YW5kZXgudWGCDXd3dy55YW5kZXguYnmCDnd3dy55
YW5kZXguY29tghF3d3cueWFuZGV4LmNvbS50coIRd3d3LnlhbmRleC5jb20udWGC
DXd3dy55YW5kZXgua3qCD3d3dy55YW5kZXgubW9iaYIOd3d3LnlhbmRleC5uZXSC
DXd3dy55YW5kZXgucnWCDXd3dy55YW5kZXguc3SCDXd3dy55YW5kZXgudWEwHQYD
VR0OBBYEFDjrNQM8dYCWIlusgG7EqlAZ5D9lMB8GA1UdIwQYMBaAFNtBJzBPGvVb
PoRWyOyFmLNRLC0nMEwGA1UdHwRFMEMwQaA/oD2GO2h0dHA6Ly9jcmxzLnlhbmRl
eC5ydS9ZYW5kZXhFeHRlcm5hbENBL1lhbmRleEV4dGVybmFsQ0EuY3JsMFcGCCsG
AQUFBwEBBEswSTBHBggrBgEFBQcwAoY7aHR0cDovL2NybHMueWFuZGV4LnJ1L1lh
bmRleEV4dGVybmFsQ0EvWWFuZGV4RXh0ZXJuYWxDQS5kZXIwPwYJKwYBBAGCNxUH
BDIwMAYoKwYBBAGCNxUIhtyhJoWT1VWH/YEtg/nnAoOV0gQci62jzDeH/MC/KAIB
ZAIBBjATBgNVHSUEDDAKBggrBgEFBQcDATAbBgkrBgEEAYI3FQoEDjAMMAoGCCsG
AQUFBwMBMA0GCSqGSIb3DQEBBQUAA4IBAQDNo4rLhEWgj72wbpYO6lSuM6YHn6Bj
BsXJfumtchTyRHsY8RJGGKGZ6joeOQweqChsQXULTnVzadCJ1VqVJ2lTaII5R8Ii
N9jcYgFl4WOv1ynFJ0Jf3V6/ePQd9cqFFJTfFSODHsyZR/Dhgez81/QExfsG/SzS
u+ACIvsDbyu7NFcAK6ZM5CKz3lcisddT/pSPbTOi7AtqtNTrvKlV2AT+5mfNTEa7
rNv6chVl1He7RW8r7uCkK6AfFb0Z4LDhv2zkvmcUtaojmDOO/2AZSXym8efCSmHr
CL2rhv6+ER3c0x5uJlhAUr1ZM76/XnfvT/2SKekPXbGlVAE3v7tfRnW9
-----END CERTIFICATE-----
Run Code Online (Sandbox Code Playgroud)

我试着PEM_write_X509在openssl的源代码中查看函数,但是我不能这么做,所以很多宏和定义.

另外,我如何检查证书的类型?它是PEM还是DER?

更新:

struct x509_st
    {
    X509_CINF *cert_info;
    X509_ALGOR *sig_alg;
    ASN1_BIT_STRING *signature;
    int valid;
    int references;
    char *name;
    CRYPTO_EX_DATA ex_data;
    /* These contain copies …
Run Code Online (Sandbox Code Playgroud)

c c++ string openssl x509

2
推荐指数
1
解决办法
5107
查看次数

Clang Tool(libtooling):设置标题库标题的标题搜索路径.基础框架

相关链接http://kevinaboos.wordpress.com/2013/07/23/clang-tutorial-part-ii-libtooling-example

我正在使用CommonOptionsParser解析clang工具的参数:

// parse the command-line args passed to your code
CommonOptionsParser op(argc, argv);
// create a new Clang Tool instance (a LibTooling environment)
ClangTool Tool(op.getCompilations(), op.getSourcePathList());

// run the Clang Tool, creating a new FrontendAction (explained below)
int result = Tool.run(newFrontendActionFactory<SomeAction>());
Run Code Online (Sandbox Code Playgroud)

和下一个参数:

llvm/Debug+Asserts/bin/mytool  /somePath/someSource.mm -- 
Run Code Online (Sandbox Code Playgroud)

当我在某个源文件上运行我的工具(基于clang libtooling)时,工具尝试查找包含的文件,fe : #import “SomeClass.h”,或#import<Foundation/Foundation.h>

如果它找不到标题,则会产生错误:

致命错误:找不到'Foundation/Foundation.h'文件.

你能告诉我,如果你知道,我怎样才能将工具引导到标准框架?我怎样才能将它指向某些标题搜索路径?如何在运行工具时设置标题搜索路径?

c++ compilation include header-files llvm-clang

2
推荐指数
1
解决办法
3786
查看次数

块是通过引用还是通过值从堆栈上的一个调用传递到另一个?

当我将块传递给其他方法(而不是用Block_copy或堆@property(copy))时,它是复制还是通过引用传递?

我的意思是:

- (void)processBlock:(MyBlockType)block param:(int)param {

}

- (void)someMethod {
    int b1 = 10;
    int a1 = 9;
    [self processBlock:^int(int number, id object) {
        NSLog(@"block");
        return 1 + a1;
    } param:b1];
}
Run Code Online (Sandbox Code Playgroud)

它是NSStackBlock- 因为它捕获"a"变量,因此它在堆栈上分配.当我将它们传递给另一个方法时,它是复制并存储在processBlock's堆栈的一部分,还是仅通过引用传递?

像那样:

copyOf myBlock
copyOf b1
processBlock
..........
..other variables..
a1
b1
myBlock
someMethod
..........
Run Code Online (Sandbox Code Playgroud)

或者像那样:

*myBlock (jast a pointer)
copyOf b1
processBlock
..........
..other variables..
a1
b1
myBlock
someMethod
..........
Run Code Online (Sandbox Code Playgroud)

iphone objective-c ios objective-c-blocks

2
推荐指数
1
解决办法
628
查看次数

在Objective-C块中调用C函数(链接器错误)

我创建了C函数:

//FileSystem.h file
#import <Foundation/Foundation.h>
BOOL AddSkipBackupAttributeToItemAtURL(NSURL *url);
Run Code Online (Sandbox Code Playgroud)

履行

//FileSystem.mm
#import "FileSystem.h"
#import <sys/xattr.h>
#import <Support/Support.h>

static const char* attrName = "com.apple.MobileBackup";
BOOL AddSkipBackupAttributeToItemAtURL(NSURL *url) {
    BOOL operationResult = NO;
    // some implementation
    return operationResult;
}
Run Code Online (Sandbox Code Playgroud)

当我AddSkipBackupAttributeToItemAtURL从应用程序的其他部分调用时,一切都很好,除了我从块中调用函数的一个地方.

__block UpdateFileAsyncOperation* selfOperation = self;
    _contentDownloader.completionBlock = ^(NSData* data) {
        [data saveForcedToPath:selfOperation.filePath];
        NSURL* fileUrlWithScheme = [NSURL fileURLWithPath:selfOperation.filePath];
        AddSkipBackupAttributeToItemAtURL(fileUrlWithScheme);
        [runLoop removePort:port forMode:NSDefaultRunLoopMode];
        [selfOperation completeOperation];
    };
Run Code Online (Sandbox Code Playgroud)

在那个地方,在进行链接时,有错误:

体系结构i386的未定义符号:
" AddSkipBackupAttributeToItemAtURL",引自:__ 36- [UpdateFileAsyncOperation start] UpdateFileAsyncOperation.o中的_block_invoke ld:未找到架构i386 clang的符号:错误:链接器命令失败,退出代码为1(使用 - v看看调用)

我不明白为什么会发生这种情况,它取决于阻止?我该如何解决这个问题?谢谢!

更新:它不依赖于块,我已将函数调用移到另一个类的地方:错误仍然存​​在.我想找到原因

c iphone linker objective-c ios

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