我有兴趣了解导致开发人员覆盖+初始化或+加载的情况.文档清楚地表明Objective-C运行时为您调用了这些方法,但这些方法的文档中确实清楚了.:-)
我的好奇心来自于Apple的示例代码 - MVCNetworking.他们的模型类有一个+(void) applicationStartup方法.它在文件系统上做一些内务处理,读取NSDefaults等等......并且,在尝试了解NSObject的类方法之后,似乎这个清洁工作可能可以放入+ load.
我确实修改了MVCNetworking项目,将App Delegate中的调用删除到+ applicationStartup,并将管家位置放入+ load ...我的计算机没有着火,但这并不意味着它是正确的!我希望能够理解你需要调用的自定义设置方法与+ load或+ initialize之间的任何细微之处,陷阱和其他内容.
对于+ load文档说:
加载消息将发送到动态加载和静态链接的类和类别,但前提是新加载的类或类别实现了可以响应的方法.
如果你不知道所有单词的确切含义,那么这句话很难解析.救命!
什么是"动态加载和静态链接?" 某些东西可以动态加载和静态链接,还是它们是互斥的?
"......新加载的类或类实现了一个可以响应的方法"什么方法?回应怎么样?
至于+ initialize,文档说:
初始化它每个类只调用一次.如果要对类和类的类别执行独立初始化,则应实现加载方法.
我的意思是,"如果你试图设置类......不要使用初始化." 好的.何时或为什么我会覆盖初始化呢?
摘要:
使用最新的安装程序(截至2012年3月9日),在OS X上设置Jenkins变得非常容易,但是管理代码签名的过程仍然非常困难,没有简单的答案.
动机:
运行无头CI服务器,该服务器遵循在OS X上运行服务的常见最佳实践(其中一些以简单语言解释).
背景:
处理:
通过OS X 安装程序包安装Jenkins CI .对于"安装类型"步骤,单击"自定义"按钮,然后选择"以启动时启动为'jenkins.'"
讨论:
在这一点上天真的期望是使用构建脚本的自由风格项目xcodebuild -target MyTarget -sdk iphoneos应该工作.正如这篇文章的标题所示,它没有,也没有失败:
Code Sign error: The identity 'iPhone Developer' doesn't match any valid certificate/private key pair in the …
ObjectProperties.h
@protocol ObjectProperties <NSObject>
@property (strong, nonatomic) NSString *name;
@property (strong, nonatomic) NSDate *date;
@property (assign, nonatomic) int64_t index;
@end
Run Code Online (Sandbox Code Playgroud)
ClassA.h
#import <Foundation/Foundation.h>
@protocol ObjectProperties;
@interface ClassA : NSObject <ObjectProperties>
- (void)specialSauce;
@end;
Run Code Online (Sandbox Code Playgroud)
ManagedClassA.h
#import <CoreData/CoreData.h>
@protocol ObjectProperties;
@interface ManagedClassA : NSManagedObject <ObjectProperties>
- (void)doSomething;
@end;
Run Code Online (Sandbox Code Playgroud)
从上面的代码示例中,我在.h文件中定义了一个协议,用于Core Data对象以及普通的'vanilla对象.似乎"噪音"使符合类#import协议在其标题中; 如上所示,在实现文件中转发声明协议和导入会更清晰.但是,当这样做时,Xcode会发出警告:
Cannot find protocol definition for 'ObjectProperties'
代码编译,主要是工作.我之所以说主要是因为Core Data试图动态创建标量属性的getter/setter有一些愚蠢,但我认为这可能是因为我遇到了边缘情况.
当然,最明显的解决方法是将协议头导入类头.
如果我的理解是正确的(我的知识是最近获得的,所以我完全有可能我错了),如果我将协议导入我的类头并对协议进行更改,那么导入我的所有后续文件必须重新编译类.
解决此类问题的正确方法是什么?
我想创建一个函数,返回符合协议的对象,但协议使用a typealias.鉴于以下玩具示例:
protocol HasAwesomeness {
typealias ReturnType
func hasAwesomeness() -> ReturnType
}
extension String: HasAwesomeness {
func hasAwesomeness() -> String {
return "Sure Does!"
}
}
extension Int: HasAwesomeness {
func hasAwesomeness() -> Bool {
return false
}
}
Run Code Online (Sandbox Code Playgroud)
String并且Int已经扩展为符合HasAwesomeness,并且每个都实现了hasAwesomeness()返回不同类型的方法.
现在我想创建一个返回符合HasAwesomeness协议的对象的类.我不在乎班级是什么,只是我可以发送信息hasAwesomenss().当我尝试以下操作时,我生成了一个编译错误:
class AmazingClass: NSObject {
func returnsSomethingWithAwesomeness(key: String) -> HasAwesomeness {
...
}
}
Run Code Online (Sandbox Code Playgroud)
错误:协议'HasAwesomeness'只能用作通用约束,因为它具有Self或相关类型要求
可以想象,目的returnsSomethingWithAwesomeness是返回一个String或者Int基于ok key参数.编译器抛出的错误有点 - sorta是有道理的,为什么它被禁止,但它确实提供了修复语法的洞察力.
func …Run Code Online (Sandbox Code Playgroud) 已安装Oracle的Java SE 1.7.0u10及其安装程序包
下载并解压缩的Eclipse Juno(4.2.1)
双击Eclipse purple图标并获取OS X警报提示,并显示错误消息:
要打开"Eclipse",您需要Java SE 6运行时.你想现在安装一个吗?
(在终端)which java-/usr/bin/java
ls -l /usr/bin/java - /usr/bin/java -> /System/Library/Frameworks/JavaVM.framework/Versions/Current/Commands/java
(在Finder中)双击eclipse别名(在解压缩下载时包含) - 终端启动,/Applications/Eclipse/Eclipse.app/Contents/MacOS/eclipse ; exit ;Exclipse启动时没有OS X警报提示.
我已经尝试修改Eclipse应用程序包plist以将-vm键指向/System/Library/Frameworks/JavaVM.frameworks/Versions/Current/Commands/java,但我觉得我可能不应该这样做. `
我想知道如何通过双击Application包来启动Eclipse.让我烦恼的是一件小事......:o)
我已经养成了一个很好的习惯,即为NSNotification名字之类的东西声明和使用常量字符串.我声明他们是这样的:
extern NSString * const ABCAwesomeThingHappenedNotification;
Run Code Online (Sandbox Code Playgroud)
随着引进的Xcode 6.3和1.2雨燕的,我要回去,使用新雨燕与互操作和审计Objective-C类nonnull,nullable和null_unspecified预选赛.
将限定符添加到也具有外部可见静态字符串的标头时,我收到以下警告:
警告:指针缺少可为空类型说明符(__nonnull或__nullable)
嗯.那令人困惑/有趣.有人可以解释这条消息背后的原因吗?ABCAwesomeThingHappenedNotification在Swift中使用时,它从不暗示它是可选的String或隐式解包的String.
我的应用程序单元在模拟器中运行时测试构建和测试,但在构建和测试设备时失败并出现链接器错误.
在我的应用程序目标上,我设置了以下构建设置:
DEPLOYMENT_POSTPROCESSING = NO
GCC_SYMBOLS_PRIVATE_EXTERN = NO
Run Code Online (Sandbox Code Playgroud)
在我的单元测试中,我设置了以下构建设置:
BUNDLE_LOADER = $(BUILT_PRODUCTS_DIR)/<app name>.app/<app>
TEST_HOST = $(BUNDLE_LOADER)
Run Code Online (Sandbox Code Playgroud)
链接器错误是:
Undefined symbols for architecture armv7s:
"_<An NSString * const>", referenced from:
-[UnitTestClassA setUp] in UnitTestClassA.o
"_<Another NSString * const>", referenced from:
-[UnitTestClassB helperMethod:] in UnitTestClassB.o
-[UnitTestClassB anotherHelperMethod:] in UnitTestClassB.o
ld: symbol(s) not found for architecture armv7s
clang: error: linker command failed with exit code 1 (use -v to see invocation)
Run Code Online (Sandbox Code Playgroud)
...我在Xcode的首选项中打开"继续构建错误后继续",但是我没有收到大量关于NSString*const的链接器错误.如果我做错了什么,那么由于我在整个生产代码中使用字符串常量,因此我会得到比我少数人更多的链接错误.
我正在创建我的字符串常量:
.h文件......
extern NSString * const ReallyGoodString;
Run Code Online (Sandbox Code Playgroud)
.m文件...
NSString * const ReallyGoodString …Run Code Online (Sandbox Code Playgroud) 在Apple的并发编程指南中,NSOperation子类示例(非并发和并发变量)使用异常处理,我想知道为什么他们在操作中鼓励这种风格.
清单2-4响应取消请求
- (void)main {
@try {
BOOL isDone = NO;
while (![self isCancelled] && !isDone) {
// Do some work and set isDone to YES when finished
}
}
@catch(...) {
// Do not rethrow exceptions.
}
}
Run Code Online (Sandbox Code Playgroud)
我的理解是,通常异常处理不是Objective-C代码中的常见做法 - 异常本质上是程序员错误,应该导致应用程序崩溃,而意外输入最好由NSError处理.(我可能误导理解来自之类的东西这个和这个)
我想知道NSOperations是否存在特殊情况,其中异常处理很重要,或者这是否是该指南的特定作者的首选样式.
作为旁注,一些NSOperation示例代码遵循此样式,其他示例则不遵循此样式.大多数高可见性OSS不使用例外(例如AFNetworking).
我试图更好地理解操作和线程,并查看AFNetworking的AFURLConnectionOperation子类,例如,真实世界的源代码.
我目前的理解是当实例NSOperation被添加到操作队列时,队列等管理负责执行操作的线程.在苹果公司的文档,NSOperation它指出,即使子类返回YES的-isConcurrent操作将始终在一个单独的线程来启动(为10.6).
基于Apple在线程编程指南和并发编程指南中强大的语言,管理线程似乎最好留给内部实现NSOperationQueue.
但是,AFNetworking的AFURLConnectionOperation子类产生了一个新的NSThread,并且操作-main方法的执行被推送到此网络请求线程.为什么?为什么这个网络请求线程是必要的?这是一种防御性编程技术,因为该库旨在供广大受众使用吗?调试库的消费者是不是更麻烦?在专用线程上进行所有网络活动是否有(微妙的)性能优势?
(
在1月26日添加)在Dave Dribin 的博客文章中,他演示了如何使用NSURLConnection的具体示例将操作移回主线程.
我的好奇心来自Apple的线程编程指南中的以下部分:
保持你的线程合理繁忙.
如果您决定手动创建和管理线程,请记住线程占用宝贵的系统资源.您应该尽力确保为线程分配的任何任务都是合理的长寿和高效的.与此同时,您不应该害怕终止花费大部分时间闲置的线程.线程使用大量内存,其中一些是有线的,因此释放空闲线程不仅有助于减少应用程序的内存占用,还可以释放更多物理内存供其他系统进程使用.
在我看来,AFNetworking的网络请求线程没有"保持相当忙碌"; 它正在运行一个无限的while循环来处理网络I/O. 但是,请注意,这就是问题的关键 - 我不知道,我只是在猜测.
AFURLConnectionOperation对操作,线程(运行循环?)和/或GCD的具体问题的任何洞察或解构都将非常有利于填补我理解的空白.
objective-c nsoperation nsthread nsoperationqueue afnetworking
当我使用 - [UIBarButtonItem initWithImage:style:target:selector:]创建条形按钮项时,我无法在导航项的后栏按钮项上应用色调颜色.
使用图像作为视图控制器背景上下文不再可以吗?我似乎无法在HIG中找到任何迹象,或者其他地方已被弃用或不鼓励.
这是我的代码:
UIBarButtonItem *barButtonItem = [[UIBarButtonItem alloc] initWithImage:[UIImage imageNamed:@"camera-navigation_item_back"]
style:UIBarButtonItemStyleBordered
target:nil
action:nil];
[navItem setBackBarButtonItem:barButtonItem];
Run Code Online (Sandbox Code Playgroud)
iOS 7结果:

iOS 6结果:

编辑:如果我尝试使用其中一个系统项目(加号,垃圾桶等)作为我的后退按钮,Apple会将图像替换为标题"返回".这实际上与iOS 6和7中的行为相同.
objective-c ×5
macos ×2
nsoperation ×2
protocols ×2
swift ×2
afnetworking ×1
eclipse ×1
exception ×1
generics ×1
ios ×1
ios7 ×1
java ×1
jenkins ×1
nsobject ×1
nsthread ×1
tintcolor ×1
type-alias ×1
uikit ×1
unit-testing ×1
xcode ×1