小编cso*_*iou的帖子

iOS Static vs Dynamic框架说明

我不得不承认,随着iOS 8的发布,我对iOS中的动态和静态框架感到有些困惑.

我正在寻找一种方法来分发我创建的库,我需要支持iOS 7及更高版本.(注意:这将是一个专有框架.我不能使用可可豆荚,我也不能分发来源).这是我已经知道的:

  • iOS 8为iOS引入了"嵌入式框架",但据我了解,它们不适用于iOS 7,仅适用于iOS 8及更高版本.
  • 我可以选择将我的库分发为静态库(.a文件)并分发标头.我知道这是处理这种情况的常用方法,但我想找到一些比这更简单的东西(如果可能的话,还要用它捆绑一些资源).
  • 我还发现iOS 7不支持动态.framework库(仅静态),因为它不支持动态链接.但是iOS 8和静态链接一样.

以下是关于此信息的问题:

  • 我看到我可以创建一个.framework目标,并通过将Mach-O类型更改为"静态库"使其成为静态.这是否足以支持iOS 7而没有任何问题,并且还可以将我的库分发为.framework bundle?如果是这样的话,为什么iOS 8中的"嵌入式框架"是一个很大的交易,因为互联网上的许多资源都在暗示?我错过了什么?
  • 是否有必要对.framework进行编码,就像我对其他任何应用程序一样?
  • 如果我需要在我的.framework文件中包含其他资源(如核心数据或图像),该怎么办?我需要为此制作一个单独的.bundle文件吗?

frameworks static-libraries static-linking ios ios-frameworks

107
推荐指数
5
解决办法
3万
查看次数

UISearchBar更改占位符颜色

有没有任何想法或代码示例如何更改UISearchBar的占位符文本的文本颜色?

placeholder uisearchbar ios

42
推荐指数
9
解决办法
4万
查看次数

Swift语言多播代表

我试图在Swift中实现多播委托功能.在Objective C中,我们有这个出色的实现

https://github.com/robbiehanson/XMPPFramework/blob/master/Utilities/GCDMulticastDelegate.m

我刚刚创建了这个基本功能:

protocol MyProtocol : class{
    func testString()-> String;
}

class MulticastDelegateNode <T:AnyObject> {
    weak var delegate : T?

    init(object : T){
        self.delegate = object;
    }
}

class MulticastDelegate <T:AnyObject> {
    var delegates = Array<MulticastDelegateNode<T>>()


    func addDelegate(delegate : T){
        var newNode = MulticastDelegateNode(object : delegate);
        delegates.append(newNode);
    }

    func removeDelegate(delegate : AnyObject){
        self.delegates = self.delegates.filter({ (node : MulticastDelegateNode) -> Bool in
            return node.delegate !== delegate;
        });
    }
}

class OP {
    var delegate  = MulticastDelegate<MyProtocol>();

    func process(){
        //...
        //make …
Run Code Online (Sandbox Code Playgroud)

cocoa ios multicastdelegate swift

9
推荐指数
2
解决办法
5485
查看次数

使用块,ARC和非ARC进行目标C内存管理

我一直在使用块一段时间,但我觉得在ARC和非ARC环境中都有一些我想念的内存管理.我觉得更深刻的理解会让我失去许多内存泄漏.

AFNetworking是我在特定应用程序中主要使用Blocks.大多数情况下,在操作的完成处理程序中,我执行类似"[self.myArray addObject]"的操作.

在ARC和非ARC启用的环境中,根据Apple的这篇文章,将保留"self" .

这意味着每当调用AFNetworking网络操作的完成块时,self将保留在该块内,并在该块超出范围时释放.我相信这适用于ARC和非ARC.我已经运行了泄漏工具和静态分析器,以便我可以发现任何内存泄漏.没有显示任何.

然而,直到最近,我偶然发现了一个我无法弄清楚的警告.我在这个特定的例子中使用ARC.

我有两个实例变量,表明网络操作的完成和失败

@property (nonatomic, readwrite, copy) SFCompletionBlock completionBlock;
@property (nonatomic, readwrite, copy) SFFailureBlock failureBlock;
@synthesize failureBlock = _failureBlock;
@synthesize operation = _operation;
Run Code Online (Sandbox Code Playgroud)

在代码的某处,我这样做:

[self.operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id
                                                    responseObject) {
NSError *error = [NSError errorWithDomain:@"com.test" code:100 userInfo:@{@"description": @"zero results"}];
            _failureBlock(error);
        } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
            NSLog(@"nothing");
        }];
Run Code Online (Sandbox Code Playgroud)

.Xcode的抱怨调用failureBlock线,以"捕获'自我’强烈该块的消息很可能导致保留周期,我相信Xcode是正确的:不良区保留自我,自我拥有自己的副本块,所以两者都不会被解除分配.

但是,我有以下问题/意见.

1)如果我将_failureBlock(错误)更改为"self.failureBlock(error)"(不带引号),编译器将停止抱怨.这是为什么?这是编译器错过的内存泄漏吗?

2)通常,在使用作为实例变量的块时,在ARC和非ARC启用的环境中使用的最佳实践什么?似乎在AFNetworking中的完成和故障块的情况下,这两个块不是实例变量,因此它们可能不属于我上面描述的保留周期类别.但是当将进度块用于AFNetworking时,可以采取哪些措施来避免像上面那样的保留周期?

我很想听听其他人对ARC和非ARC的看法,包括带有内存管理的块和问题/解决方案.我发现这些情况容易出错,我觉得有必要对此进行一些讨论以便清理.

我不知道它是否重要,但我使用Xcode 4.4和最新的LLVM.

memory-management objective-c objective-c-blocks automatic-ref-counting afnetworking

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

Linux使用OpenGL 3.2+ w/FBO在屏幕外渲染

我有ubuntu机器,以及用OS X编写的命令行应用程序,它使用FBO在屏幕外渲染.这是代码的一部分.

        this->systemProvider->setupContext(); //be careful with this one. to add thingies to identify if a context is set up or not
    this->systemProvider->useContext();
    glewExperimental = GL_TRUE;
    glewInit();


    GLuint framebuffer, renderbuffer, depthRenderBuffer;

    GLuint imageWidth = _viewPortWidth,
            imageHeight = _viewPortHeight;

    //Set up a FBO with one renderbuffer attachment
    glGenFramebuffers(1, &framebuffer);
    glBindFramebuffer(GL_FRAMEBUFFER, framebuffer);

    glGenRenderbuffers(1, &renderbuffer);
    glBindRenderbuffer(GL_RENDERBUFFER, renderbuffer);
    glRenderbufferStorage(GL_RENDERBUFFER, GL_RGB, imageWidth, imageHeight);
    glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, renderbuffer);


    //Now bind a depth buffer to the FBO
    glGenRenderbuffers(1, &depthRenderBuffer);
    glBindRenderbuffer(GL_RENDERBUFFER, depthRenderBuffer);
    glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT, _viewPortWidth, _viewPortHeight);
    glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, …
Run Code Online (Sandbox Code Playgroud)

linux opengl fbo glx

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

如何从 Mac OS 中的 SwiftUI 列表中删除底部/顶部项目填充

我很难使用 SwiftUI 从 MacOS 中的单元格中删除所有填充。即使在苹果的代码中我似乎也无法做到这一点!

https://developer.apple.com/tutorials/swiftui/creating-a-macos-app

例如,在 Xcode 中的文件夹内LandMarkList,我在其末尾MacLandmarks添加了,以便代码如下所示:.listRowInsets(EdgeInsets())forEach

struct LandmarkList: View {
    @EnvironmentObject private var userData: UserData
    @Binding var selectedLandmark: Landmark?
    @Binding var filter: FilterType

    var body: some View {
        List(selection: $selectedLandmark) {
            ForEach(userData.landmarks) { landmark in
                if (!self.userData.showFavoritesOnly || landmark.isFavorite)
                    && (self.filter == .all
                        || self.filter.category == landmark.category
                        || (self.filter.category == .featured && landmark.isFeatured)) {
                    LandmarkRow(landmark: landmark).tag(landmark)
                        .background(Color.red)
                }
            }
            .listRowInsets(EdgeInsets())
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我还在每个单元格中放置了红色背景颜色。这是我得到的结果:

顶部和底部空间

关键是我似乎无法摆脱这个列表的单元格之间的垂直空间。我见过的所有解决方案似乎都提到了 iOS,但我想在 Mac OS 中执行此操作(它应该具有相同的行为,但事实并非如此)。

macos ios swiftui swiftui-list

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

在iOS项目中混合使用stdc ++和libc ++

我很难配置iOS项目,该项目使用与gcc使用的旧libstdc ++链接的静态库.该库是32位和64位.

有6个库(例如libssl.a)是32位的,必须更新.如果我从源代码编译这些库,它们将自动与libc ++链接,这将导致我的链接器抱怨.

因此,这是我的问题:

1)有没有办法让项目中的单个静态库使用libstdc ++,让其他人使用libc ++?

2)如何从源代码编译库(如libcrypto和libssh)并强制它们使用旧的libstdc ++标准库?

3)这个烂摊子还有其他方法吗?

xcode static-libraries libstdc++ ios libc++

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