我正在使用clang/llvm以编程方式编译和链接C源代码.我发现llvm链接器似乎没有报告模块中存在未解析的外部因为错误的事实.
我有以下代码(原谅长度,但这确实是最低要求):
int CompileAndLink()
{
llvm::InitializeNativeTarget();
std::string code = "int UnresolvedFunction();\n"
"int main() { return UnresolvedFunction(); }";
clang::DiagnosticOptions diagnosticOptions;
clang::TextDiagnosticPrinter tdp( llvm::outs(), diagnosticOptions );
llvm::IntrusiveRefCntPtr<clang::DiagnosticIDs> diagIDs( new clang::DiagnosticIDs );
clang::Diagnostic diag( diagIDs, &tdp, false );
clang::FileSystemOptions fsOptions;
clang::FileManager fm( fsOptions );
clang::SourceManager sm( diag, fm );
clang::HeaderSearch hs( fm );
clang::TargetOptions targetOptions;
targetOptions.Triple = llvm::sys::getHostTriple();
clang::TargetInfo* ti = clang::TargetInfo::CreateTargetInfo( diag, targetOptions );
clang::HeaderSearchOptions headerSearchOptions;
clang::LangOptions langOptions;
clang::ApplyHeaderSearchOptions( hs, headerSearchOptions, langOptions, ti->getTriple() );
clang::PreprocessorOptions ppo;
clang::Preprocessor pp( diag, langOptions, *ti, sm, …Run Code Online (Sandbox Code Playgroud) 我编写了一个NSTextView子类,它对文本本身进行频繁的编程修改(有点像IDE的代码格式化 - 例如自动插入紧密括号).
我最初的实现使用了NSTextView insertText:.这实际上看起来完全正常.但是在阅读NSTextView文档时(我有时会为了好玩),我在讨论部分注意到了insertText:
此方法是插入用户键入的文本的入口点,通常不适用于其他目的.最好通过直接对文本存储进行操作来对文本进行编程修改.
哦,我的坏,我想.因此,我尽职尽责地将所有insertText调用更改为对底层NSTextStorage(replaceCharactersInRange:withString:主要是)的调用.这似乎工作正常,直到我注意到它完全搞砸了Undo(当然,因为Undo是由NSTextView处理的,而不是NSTextStorage).
所以在我把文件存储器中的buncha撤销代码拖出来之前,我想知道我insertText:是不是Punk'd,真的不是那么糟糕?
是的,所以我的问题是:NSTextView的insertText:调用真的"不适合"编程修改NSTextView的文本,如果是的话,为什么呢?
我正在为游戏添加Game Center支持.因为我的游戏可以在iOS版本上运行回3.0,所以我想让它在没有Game Center的情况下在本地保存成就和排行榜.
现在,我有这个:
+ (BOOL) isGameCenterAvailable {
Class playerClass = NSClassFromString( @"GKLocalPlayer" );
if( playerClass != nil && [playerClass localPlayer] != nil ) {
DebugLog( @"Game Center is available" );
return YES;
}
DebugLog( @"Game Center is NOT available" );
return NO;
}
Run Code Online (Sandbox Code Playgroud)
但是,这似乎根本不起作用.首先,尽管GKLocalPlayer参考声明此类在iOS 4.1及更高版本中可用,但上述测试在iOS 4.0中通过(我没有尝试早期版本).另外,测试还传递了具有iOS 4.1但不支持Game Center的设备(例如,iPhone 3G).
我已经在线浏览了各种GameKit和游戏中心文档,并且没有任何运气可以解决这个问题.我当然可以检测到操作系统版本,但这似乎很蹩脚.对于不支持的硬件(如3G)的情况,这也无济于事.我想也可以检测到这一点,但是再次看起来有点蹩脚.
以编程方式检测Game Center支持的"正确方法"是什么?
我知道为早于iPhone5的iPhone开发的应用程序正在信箱中工作.但逆转怎么样.一款应用已更新至iPhone5标准.它如何在iPhone4上运行?
如果没有,当所有开发者更新他们的应用程序时,旧的iPhone将没有应用程序或更新?
我正在开发我的第一个iPhone应用程序,在实现用户首选项时,我有一些关于如何最好地实现它的问题.
假设基本的MVC模式:MainView显示存储在Model对象中的数据; MainViewController处理app逻辑.
对于选项,我有一个OptionsView和一个OptionsViewController.RootViewController处理Main和Options视图的交换.
首先,选项数据怎么样?我想创建一个NSOjbect派生类来存储它们(一个OptionsModel)吗?或者一个简单的NSDictionary就足够了?
第二,谁拥有期权数据?它们是应用程序首选项,但将它们存储在AppDelegate中似乎是错误的.MainViewController主要关注选项,而OptionsViewController需要编辑它们,但是这些人不会彼此了解,也不应该相互了解.RootViewController知道两者,所以他处于一个很好的位置,可以在它们之间传递选项,但同样,这似乎是错误的.
最后,MainViewController将经常需要访问选项.他应该每次调用选项模型来获得一些选项,还是缓存他自己的副本?我不喜欢额外开销检索选项数据的想法,但让MainViewController具有可能不同步的副本也不是很吸引人.
iphone model-view-controller objective-c options preferences
所以我一直在Xcode4中为一个有多个集合视图的应用程序工作(准确地说是4)
我有两个视图,一个底部的"主"视图,其中包含一个填充屏幕的大型集合视图,以及一个较小的"抽屉"视图,可以从侧面拉出并包含三个窄的,水平滚动的集合视图,一个堆叠在一起另一个的顶部.
我一直使用标签和cellforitematpath方法中的if语句来填充单元格.在xcode 4中,以及我在xcode 4中创建的项目,我现在在xcode 5中打开,这是有效的.我在底部得到一个警告(而不是错误)control may reach end of non void function,但我仍然可以构建和运行它的工作原理.
在xcode 5中的一个新项目中,相同的代码将"控制可能达到非空函数的结尾"视为错误,并且不允许构建和运行.这无穷无尽令人沮丧.除非有一个数组要填充单元格,否则我不想返回单元格.我甚至都不知道'返回零'是什么意思.有没有人有任何关于如何关闭它的建议?
以下绝对不是很好,请自担风险:
- (UICollectionViewCell *) collectionView:(UICollectionView *)collectionView
cellForItemAtIndexPath:(NSIndexPath *)indexPath
{
if (collectionView.tag == 0){
static NSString *CellIdentifier = @"subjectCell";
SubjectCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:CellIdentifier forIndexPath:indexPath];
AHSubject *cellSubject = [self.subjectsArray objectAtIndex:indexPath.row];
[[cell subjectLabel]setText:cellSubject.name];
return cell;
}
else if (collectionView.tag == 1){
if ([categoryArray count] > 0) {
static NSString *CellIdentifier = @"categoryCell";
CategoryCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:CellIdentifier forIndexPath:indexPath];
AHCategory *cellCategory = [categoryArray objectAtIndex:indexPath.row]; …Run Code Online (Sandbox Code Playgroud) 我正在使用UITableView来选择一个(很多)项目.与选择铃声时的UI类似,我想要检查所选项目,而不是其他项目.我想在触摸时选择单元格,然后将其设置为正常颜色(再次,就像铃声选择UI一样).
UIViewController子类是我的表的委托和数据源(不是UITableViewController,因为我还有一个工具栏).
我在cellForRowAtIndexPath:中设置单元格的accessoryType,并在didSelectRowAtIndexPath:中选择单元格时更新我的模型.我可以想到将所选单元格设置为复选标记(并清除前一个单元格)的唯一方法是在didSelectRowAtIndexPath:中调用[tableView reloadData].但是,当我这样做时,单元格取消选择的动画很奇怪(单元格的标签应该出现一个白框).当然,如果我不调用reloadData,则accessoryType不会更改,因此不会出现复选标记.
我想我可以关闭动画,但这似乎很蹩脚.我也玩弄了改变didSelectRowAtIndexPath:中的细胞,但这是一个很大的痛苦.
有任何想法吗?缩写代码如下......
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
UITableViewCell* aCell = [tableView dequeueReusableCellWithIdentifier:kImageCell];
if( aCell == nil ) {
aCell = [[UITableViewCell alloc] initWithFrame:CGRectZero reuseIdentifier:kImageCell];
}
aCell.text = [imageNames objectAtIndex:[indexPath row]];
if( [indexPath row] == selectedImage ) {
aCell.accessoryType = UITableViewCellAccessoryCheckmark;
} else {
aCell.accessoryType = UITableViewCellAccessoryNone;
}
return aCell;
}
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
[tableView deselectRowAtIndexPath:indexPath animated:YES];
selectedImage = [indexPath row]
[tableView reloadData];
}
Run Code Online (Sandbox Code Playgroud) 我有一个应用程序(游戏),可以保存数据:游戏状态,高分,成就等.目前,应用程序代表执行此操作applicationWillTerminate:.在使用iPhone 4之后,似乎应用程序几乎永远不会终止:它们只是永远在后台运行,除非用户竭尽全力退出它们,或重新启动手机.
所以我的问题是,我应该找到另一个地方来保存我的数据,如果是,那么什么时候?
iphone ×6
objective-c ×4
ios ×2
c ×1
c++ ×1
clang ×1
cocoa ×1
gamekit ×1
ios4 ×1
iphone-4 ×1
iphone-5 ×1
linker ×1
llvm ×1
macos ×1
nstextview ×1
options ×1
preferences ×1
uitableview ×1
xcode ×1