小编Lio*_*Lio的帖子

DWARF和DWARF与dSYM文件有什么区别?

XCode支持此Build设置的这两个值:

构建设置>构建选项>调试信息格式.

有谁可以解释这些差异?

xcode ios

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

为什么我应该选择GCD而非NSOperation并阻止高级应用程序?

Apple的Grand Central Dispatch参考文献称:

"......如果你的应用程序需要在系统的Unix级别运行 - 例如,如果它需要操作文件描述符,Mach端口,信号或定时器.GCD不仅限于系统级应用程序,而是在你之前将它用于更高级别的应用程序时,您应该考虑Cocoa中提供的类似功能(通过NSOperation和块对象)是否更易于使用或更适合您的需求."

http://developer.apple.com/library/ios/#documentation/Performance/Reference/GCD_libdispatch_Ref/Reference/reference.html

对于高级应用程序,我实际上无法想到这种情况,其中GCD的使用是强制性的,并且可以/不应该使用NSOperation.

有什么想法吗?

concurrency objective-c grand-central-dispatch ios objective-c-blocks

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

什么是GCC_NO_COMMON_BLOCKS用于?

我发现我的项目设置了

GCC_NO_COMMON_BLOCKS = NO 
Run Code Online (Sandbox Code Playgroud)

在Apple LLVM编译器3.1 - 代码生成设置下,为"无公共块"

在此输入图像描述

我想知道:那个国旗用的是什么?

非常感谢

xcode objective-c llvm ios

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

Objective-c异步通信:目标/动作或委托模式?

我正在处理一些异步通信情况(事件驱动的XML解析,NSURLConnection响应处理等).我将尝试简要解释一下我的问题:

在我目前的场景中,有一个服务提供者(可以与xml解析器通信或进行一些网络通信)和一个可以要求服务提供者异步执行某些任务的客户端.在这种情况下,当服务提供者完成其处理时,它必须将结果传回给客户端.

我试图找到一种模式或经验法则来实现这种事情,我看到了3种可能的解决方案:

1.使用委托模式:客户端是服务提供者的委托,它将在任务完成时收到结果.

2.使用目标/操作方法:客户端要求服务提供者执行任务并传递一个选择器,该选择器必须在服务提供者完成任务后调用.

3.使用通知.

(更新)经过一段时间尝试解决方案#2(目标和行动)后,我得出的结论是,在我的情况下,最好使用委托方法(#1).以下是每个选项的优缺点,我看到它们:

授权方法:

  • 1(+)选项1的优点是我们可以检查编译时错误,因为客户端必须实现服务提供者的委托协议.

  • 1( - )这也是一个缺点,因为它导致客户端与服务提供商紧密耦合,因为它必须实现其委托协议.

  • 1(+)它允许程序员轻松浏览代码并找到客户端的哪种方法,服务提供者正在调用以传递其结果.

  • 1( - )从客户端的角度来看,一旦获得结果,找到服务提供者将调用的方法并不容易.它仍然很简单,只需转到委托协议方法,就是这样,但#2方法更直接.

  • 1( - )我们必须编写更多代码:定义委托协议并实现它.

  • 1( - )另外,委托模式应该用于委派行为.从语义上讲,这种情况不一定是授权的确切情况.

行动/目标方法

  • 2(+)选项2的优点是,当调用服务提供者方法时,还必须指定指定回调操作的@selector,以便程序员知道将调用哪个方法来处理结果.

  • 2( - )与此相反,在浏览服务提供商代码时很难找到在客户端中回调哪种方法.程序员必须转到服务调用,看看传递了哪个@selector.

  • 2(+)这是一个更加动态的解决方案,可以减少部件之间的耦合.

  • 2( - )也许是最重要的事情之一:它可能导致运行时错误和副作用,因为客户端可以将不存在的选择器传递给服务提供者.

  • 2( - )使用简单和标准的方法(#performSelector:withArgument:withArgument :),服务提供者最多只能传递2个参数.

声明:

  • 我不会选择通知,因为我认为当需要更新多个对象时应该使用它们.此外,在这种情况下,我想直接告诉委托/目标对象在构建结果后要做什么.

结论:此时,我会选择委托机制.这种方法提供了更高的安全性,并允许轻松浏览代码以跟踪向委托发送服务提供者操作结果的后果.关于这个解决方案的负面影响是:它是一个更静态的解决方案,我们需要编写更多的代码(协议相关的东西),从语义上讲,我们不是真正谈论委托,因为服务提供商不会委托任何东西.

我错过了什么吗?你推荐什么,为什么?

谢谢!

iphone cocoa delegation objective-c target

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

遍历NSDictionary的键/值,是enumerateKeysAndObjectsUsingBlock比循环键和调用objectForkey更有效:?

我需要遍历字典的所有键/值对并对这两个字段执行某些操作.我想知道什么是更高效,传统的'foreach key'方法或使用enumerateKeysAndObjectsUsingBlock的块方法:

这里有一个例子:

传统方法(块之前)

for (NSString* key in [self.dictionary allKeys] ) {
    [self processKey:key value: [self.dictionary objectForKey:value ]];
}
Run Code Online (Sandbox Code Playgroud)

阻止方法.

 [self.dictionary enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop){
        [self processKey:key value:obj];
    }]; 
Run Code Online (Sandbox Code Playgroud)

我的直觉是使用块遍历键/值对更快,但我不确定,因为我不知道字典和特定块方法是如何实现的.

有什么想法吗?

提前致谢!

iphone performance nsdictionary ios objective-c-blocks

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

使用Objective-C中的类别的私有方法:从子类调用super

我正在阅读如何在Objective-C中实现私有方法(在Objective-C中为类定义私有方法的最佳方法)以及我脑海中浮现的一个问题:

您如何设法实现受保护的方法,即子类可见的私有方法?

假设我有一个MySuperClass,其中包含一个包含其所有私有方法的Category,我想实现一个MySubclass覆盖或调用super到其中一个MySuperClass私有方法.这是可能的(使用Categories方法实现私有方法)?

看一下这些代码,底部有覆盖方法.

// ===========================
// = File: MySuperClass.h
// = Interface for MySuperClass
// ===========================

@interface MySuperClass : Object
...
@end

// ===========================
// = File: MySuperClass.m
// ===========================
#import "MySuperClass.h"

// =================================
// = Interface for Private methods
// =================================
@interface MySuperClass (Private)

-(void) privateInstanceMethod; 

@end

// =====================================
// = Implementation of Private methods
// =====================================
@implementation MySuperClass (Private)

-(void) privateInstanceMethod
{
  //Do something
}

@end

// ================================
// = Implementation for MySuperClass
// ================================ …
Run Code Online (Sandbox Code Playgroud)

methods private objective-c super categories

12
推荐指数
2
解决办法
5618
查看次数

是否可以调用performSelectorOnMainThread:调用beginBackgroundTaskWithExpirationHandler并且应用程序在后台?

我正在启动这样的后台任务:

UIApplication* application = [UIApplication sharedApplication];
_backgroundTask = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^
                           {
                               [application endBackgroundTask:_backgroundTask];
                               _backgroundTask = UIBackgroundTaskInvalid;
                           }];
Run Code Online (Sandbox Code Playgroud)

该应用程序被发送到后台,一切都很好.

一段时间后,满足某些条件,并且某些对象最终执行此代码:

[self performSelectorOnMainThread:@selector(doSomething) withObject:nil waitUntilDone:YES];
Run Code Online (Sandbox Code Playgroud)

那时,应用程序崩溃了!

请注意,在这种特殊情况下,对象正在主线程中执行.

我用以下代码替换了上面的代码:

    dispatch_async(dispatch_get_main_queue(), ^{
        [self doSomething];
    });
Run Code Online (Sandbox Code Playgroud)

一切似乎都没问题,崩溃消失了.

我能想象的是,waitUntilDone:YES可能与众不同,但这只是我的直觉.

我的问题是:

是否允许使用performSelectorOnMainThread:withObject:waitUntilDone:当应用程序在后台运行时是?

如果是这种情况,为什么应用程序崩溃以及dispatch_async解决问题的原因是什么?

提前致谢!

multithreading grand-central-dispatch ios

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

找出一个块需要多少个参数

假设我有一个包含Blocks的数组,我需要声明所有这些都需要一定数量的参数.

有没有办法以编程方式找到它?

objective-c objective-c-blocks

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

WidgetKit 在 M1 上的模拟器中不起作用,有什么想法吗?

  1. 在M1 机器上创建 SwiftUI 应用程序
  2. 在模拟器上运行
  3. 创建小部件扩展目标
  4. 尝试在模拟器中运行它。

我收到此错误:

2021-10-27 15:35:36.959366-0300 EmojiWidgetExtension[9771:1239405] [db] _LSSchemaConfigureForStore failed with error Error Domain=NSOSStatusErrorDomain Code=-10817 "(null)" UserInfo={_LSFunction=_LSSchemaConfigureForStore, ExpectedSimulatorHash={length = 32, bytes = 0x8367042c 5a0d3739 c4750e92 134b458d ... 2bd5ba9c f73141f5 }, _LSLine=405, WrongSimulatorHash={length = 32, bytes = 0x2bea4bde a7079a50 310364fe 5294f4b1 ... 1a2344cc eb36b0fc }}
2021-10-27 15:35:36.960137-0300 EmojiWidgetExtension[9771:1239405] [db] Failed to initialize client context with error Error Domain=NSOSStatusErrorDomain Code=-10817 "(null)" UserInfo={_LSFunction=_LSSchemaConfigureForStore, ExpectedSimulatorHash={length = 32, bytes = 0x8367042c 5a0d3739 c4750e92 134b458d ... 2bd5ba9c f73141f5 }, _LSLine=405, WrongSimulatorHash={length …
Run Code Online (Sandbox Code Playgroud)

widgetkit apple-m1

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