我经常看到在Xcode/Objective-C实现文件中导入第三方库的开源代码,如下所示:
#import <ThirdPartyLibrary/utilities.h>
Run Code Online (Sandbox Code Playgroud)
但是当我在项目中拖放文件结构和这样一个库的文件时,所有这些导入都被破坏了,Xcode不知道文件的位置.
我最终手动修改每个导入看起来像:
#import "utilities.h"
Run Code Online (Sandbox Code Playgroud)
并且包含似乎与文件系统上的当前物理文件夹相关.当库在文件系统上的文件夹中分割文件并将其拖放到Xcode中时,Xcode会为文件夹创建组.但是对于导入,我必须指定文件夹名称.问题是我在一个文件夹中,例如:
HTTP/httpTools.h
然后当httpTools.h想要从root用户导入utilities.h时,我必须改变
#import <ThirdPartyLibrary/utilities.h>
Run Code Online (Sandbox Code Playgroud)
至
#import "../utilities.h"
Run Code Online (Sandbox Code Playgroud)
这是一件苦差事.这样做了5个小时后我觉得该死的,必须有更好的方法.有人能解释一下教Xcode的秘诀是一个可以用尖括号导入的新框架位置吗?框架btw是源代码.没编译.只是裸露的代码.
我差不多完成了我的数据映射器,但现在我正处于关系的关键时刻.
我会试着在这里说明我的想法.我无法找到关于这个主题的好文章/信息,所以也许我正在重新发明轮子(我确定,我可以使用一个大框架 - 但我想通过这样做来学习).
1:1关系
首先,让我们看一下1:1的关系.通常,当我们有一个名为"Company"的域类和一个名为"Address"的域类时,我们的Company类将具有类似address_id的内容.让我们说在大多数情况下我们只显示公司列表,只有当有人查看详细信息时才需要地址.在这种情况下,我的数据映射器(CompanyDataMapper)只是懒惰加载,这意味着它只从数据库中获取该address_id,但也不会进行连接以获取地址数据.
一般来说,我对每个关系都有一个getter方法.所以在这种情况下,有一个getAddress(Company companyObject)方法.它需要一个公司对象,查找它的地址属性,如果它是NULL,则使用该Address对象的Mapper类(AddressDataMapper)从数据库中提取相应的Address对象,并将该地址对象分配给指定的address属性.公司对象.
重要提示:数据映射器是否允许使用其他数据映射器?
让我们说在大多数情况下,您需要公司对象和地址对象,因为您始终将它一起显示在列表中.在这种情况下,CompanyDataMapper不仅可以获取公司对象,还可以使用JOIN进行SQL查询,以获取地址对象的所有字段.最后,它迭代记录集并使用相应的值提供新对象,将地址对象分配给公司对象.
听起来很简单,到目前为止.
1:n关系
这些怎么样?与1:1的唯一区别在于公司可能有多个Address对象.让我们来看看:当我们大部分时间只对公司感兴趣时,Data Mapper只会将公司对象的addresses属性设置为NULL.addresses属性是一个可以引用无,一个或多个地址的数组.但是我们还不知道,因为我们懒得加载,所以它只是NULL.但是,如果在大多数情况下我们还需要所有地址呢?如果我们要显示包含所有公司及其所有地址的大清单?在这种情况下,事情开始变得非常丑陋.首先,我们不能为每个地址对象加入地址表五十次(我坚信这是不可能的,如果是,性能将低于零).所以,当我们进一步思考这个问题时,在这种情况下不可能懒得加载.
重要提示:这是真的吗?如果我有10个公司,每10个地址,我必须发出100个查询才能获得100个地址对象吗?
m:n关系
让我们说一个地址对象只包含国家,州,城市,道路和门牌号码.但是,一栋房子可能是一座大型商业大厦,其中有很多公司.就像其中一个现代化的办公楼,任何人都可以在其网站上租一个小rom来炫耀那座塔楼.所以:许多公司可以共享相同的地址.
我还没有计划处理这类问题.
重要提示:可能与1:n关系相比,这不是一个更大的问题吗?
如果有人知道有关解决/实现这个问题的详细资源,我会很高兴找到一个链接!
我稍微记得自动加载与new声明一起工作.现在,当我有几个实用程序类并且我想自动加载这些时怎么样?我只使用静态方法?
喜欢:
MathGuru::calculateFoo($bar);
Run Code Online (Sandbox Code Playgroud)
autoload会在这里加载MathGuru吗?或者我必须手动包含它吗?
我按照Ray Wenderlich教程书实现了一个简单的非消费类应用内购买机制.
当我的应用开始时,我发起了产品信息请求:
self.productsRequest = [[SKProductsRequest alloc] initWithProductIdentifiers:productIdentifiers];
_productsRequest.delegate = self;
[_productsRequest start];
Run Code Online (Sandbox Code Playgroud)
SKProductRequest已创建.它有一个内存地址,但没有其他事情发生.没有调用任何委托方法:
- (void)productsRequest:(SKProductsRequest *)request didReceiveResponse:(SKProductsResponse *)response {
NSLog(@"Product info received...");
NSArray *products = response.products;
for (SKProduct *product in products) {
NSLog(@"ID: %@, title:%@, (%f)", product.productIdentifier, product.localizedTitle, product.price.floatValue);
}
self.productsRequest = nil;
}
- (void)request:(SKRequest *)request didFailWithError:(NSError *)error {
NSLog(@"Failed to load list of products");
self.productsRequest = nil;
}
Run Code Online (Sandbox Code Playgroud)
我检了两次:
Ray Wenderlich的书中没有提到除此之外我还必须做任何其他事情.
只有一次我看到-didFailWithError:在设备上调用我的委托,但它再也没有出现过.我的代表在设备或模拟器上都没有被调用.我让它运行几分钟而没有任何反应.
iTunes Connect提供了这个令人困惑的警告: …
在Xcode中,我可以将框架设置为"Optional"而不是"Required",这意味着框架是弱链接的.
这是否意味着框架只在某个地方导入时才包含在捆绑包中?
我想弱连接一些使用私有API的调试框架,我不希望它们出现在App Store构建中.
是否有一种机制可以让对象知道归零弱引用变为零?
例如,我有一个属性
@property (nonatomic, weak) MyClass *theObject;
Run Code Online (Sandbox Code Playgroud)
当对象解除分配并且属性变为零时,我希望得到通知.但是怎么样?当对象消失时,归零弱参考系统是否使用setter将属性设置为nil?
有人告诉我InnoDB比MyISAM好多了.所以当我创建一个表时,我是否应该总是尝试使用InnoDB Engine而不是MyISAM?或者两者都有它的巨大好处?
我声明了一个属性来引用GCD队列:
@property (assign) dispatch_queue_t backgroundQueue;
Run Code Online (Sandbox Code Playgroud)
在类的init方法中,我创建了一个串行队列:
backgroundQueue = dispatch_queue_create("com.company.app", DISPATCH_QUEUE_SERIAL);
Run Code Online (Sandbox Code Playgroud)
ARC抱怨:"将保留对象分配给unsafe_unretained变量;对象将在分配后释放"
我必须使用__bridge_transfer吗?
在-dealloc我发布队列:
dispatch_release(backgroundQueue);
Run Code Online (Sandbox Code Playgroud)
ARC再次提出抱怨:"ARC禁止发布'发布'的明确消息"
我发现这令人困惑,因为这是一个C函数调用,思想队列是C对象,我必须自己处理内存管理!从什么时候开始为我处理C-objects?
memory-management grand-central-dispatch ios automatic-ref-counting
例
self.accessibilityTraits |= UIAccessibilityTraitAdjustable;
Run Code Online (Sandbox Code Playgroud)
添加UIAccessibilityTraitAdjustable选项.但是如何从面具中删除一个选项,而不必设置所有内容?
当我isAccessibilityElement = NO在包含子视图的视图上设置时isAccessibilityElement = YES,VoiceOver仍会检测到它们.
我需要关闭整个视图层次结构的可访问性,VoiceOver必须以不同方式处理.如何在不必遍历对象图中的每个项目并弄乱它的设置的情况下实现这一目标?
ios ×7
ipad ×3
iphone ×3
objective-c ×3
c ×2
xcode ×2
datamapper ×1
frameworks ×1
innodb ×1
myisam ×1
mysql ×1
oop ×1
php ×1
voiceover ×1
weak-linking ×1