我有一个类(但没有实例),需要知道它是否符合某个协议.但是,Class可以多次子类化,class_conformsToProtocol()忽略在超类上声明的协议.
我可以使用class_getSuperclass()并递归检查层次结构中的所有类,直到超类为nil.但是,我想知道这对于深层嵌套的类层次结构来说是否效率低下,也许有更好的方法可以做到这一点?
换句话说,如何使用Objective-C运行时方法最好地实现NSObject方法conformsToProtocol,以便在超类上找到协议?
[myObject conformsToProtocol:@protocol(MyProtocol)];
Run Code Online (Sandbox Code Playgroud)
如果我在正确的轨道上以递归方式上升类层次结构,请告诉我.
我打算仅以邀请方式将我的源代码分享给几十个用户.源代码本身不应该是公开的.允许并鼓励参与者提交更改.所以我需要源代码控制,最好是Git,托管在具有多个用户的私有访问级别的公共服务器上.
我了解到可以在GitHub上设置使用https://链接的私有git存储库.在GitHub本身,这样的项目不会出现在搜索中.对于参与的用户,项目显示"锁定"图标.所以显然有私人存储库,我只是不知道如何设置一个.许多教程使用SSH来设置私有存储库,但它们都要求您拥有"自己的服务器".
推送/拉动源代码时我不关心安全连接,也不关心GitHub的信任问题.我所关心的只是私人存储库,只能访问我邀请的用户.也许我很天真,这样的解决方案只能通过商业主机(例如Unfuddle,Assembla)获得,但如果没有,我真的很想知道它是如何完成的!
我有一个工作区,其中包含一个项目,该项目链接到另一个项目中的静态库(也在工作区中).这是Kobold2D中的一个问题我无法解决,即使我理解原因,我想它与这个问题类似.
项目目标和静态库目标都具有Debug和Release构建配置.一切都很好.
现在,有人在项目中添加了新的构建配置,并将其命名为Ad-Hoc.现在,项目的目标构建了Ad-Hoc配置,但是静态库没有这样的配置.显然,他们默认构建Release配置.
最后,当链接器应该将所有内容组合在一起时,它会失败:
ld: library not found for -lbox2d-ios
Command /Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/clang++ failed with exit code 1
Run Code Online (Sandbox Code Playgroud)
对于通过-force_load $(BUILT_PRODUCTS_DIR)/libSomeLib.a
错误强行加载的库类似但是说"找不到文件".我应该注意,库"libbox2d-ios.a"位于"带库的链接二进制"构建阶段列表中.
显然问题是链接器假设这些库位于BUILT_PRODUCTS_DIR中的Ad-Hoc-iphoneos文件夹中,而它们实际上位于Release-iphoneos文件夹中,因为它们没有Ad-Hoc构建配置.
我怎么能把连接器打到脸上并告诉他把它们放在哪里呢?最好是我正在寻找适用于这两种情况的解决方案,即库添加标准方式(链接二进制文件库构建阶段)和需要额外-force_load才能工作的库.
我希望有一些方法可以:
对不起,但我不得不这样说...... ARGH!:)
当我使用Sprite Kit创建一个新的OS X"Game"项目,并在任何地方设置断点时,我可以看到变量值就好了:
然后我更改代码以导入我自己的框架(TilemapKit),这是一个纯粹的Objective-C框架:
import SpriteKit
import TilemapKit
class GameScene: SKScene {
override func didMoveToView(view: SKView) {
print("dang!")
}
}
Run Code Online (Sandbox Code Playgroud)
没有其他变化.我甚至没有使用任何TilemapKit代码.当断点触发时,我看到:
就观察变量值而言,整个项目停止可调试.这种行为完全一致.没有框架导入,我可以再次调试.
由于我使用Xcode 7 beta(7A121l)和OS X 10.11开发人员预览版,我知道这可能只是一个(临时)错误.
命令行Tiles设置为使用Xcode 7.0版本btw.我尝试在框架目标中启用模块,确保部署目标相同(10.11),禁用符号剥离.我在其中添加了一个Bridging Header和#imported TilemapKit框架(在这种情况下删除Swift导入仍然会给我不可调试的应用程序,所以我导入框架的方式和位置似乎并不重要).
有没有人建议什么可能导致这种行为以及我如何解决这个问题 - 或者至少我如何尝试缩小问题?
罪魁祸首是否更有可能与项目的框架构建设置相关联?我是否需要在应用程序项目中启用某些内容以使其与ObjC框架兼容?(我已在其他链接器标志中获得-ObjC)
更新:
我跑进po self
调试控制台,发现了这个通知:
<built-in>:3:6: error: module 'TilemapKit' was built in directory '/TilemapKit.framework' but now resides in directory './TilemapKit.framework'
#define __clang_major__ 7
^
missing required module 'TilemapKit'
Debug info from this module will be unavailable in the debugger.
Run Code Online (Sandbox Code Playgroud)
为什么框架构建目录发生了变化?那为什么会这么重要以及如何解决这个问题?
PS:新的ObjC应用程序中的相同框架可以调试得很好.
我很难过.Xcode 5 - 仅限最终版本和公共版本 - 在重新启动Xcode时将不再自动重新打开以前打开的项目.此功能始终用于工作,包括Xcode 5 GM种子.
我在"系统偏好设置"中找不到有关"打开最后一个窗口"或类似内容的任 它曾经在General页面上.这就是我的版本中的所有内容:
有谁知道如何重新启用此功能,你能否确认它已消失?或者我有一个破碎的Xcode?
我刚开始一个新的Sprite Kit项目来学习如何使用它.我观看并阅读了很多教程,但没有教程可以解答我的问题/问题.
我想为我的iPhone 5S创建一个应用程序.因此屏幕尺寸为1136x640.我为我的应用程序创建了一个1136x640背景图像.但是,当我将图像添加到我的应用程序时,它可能会变大!iOS模拟器只显示图像的中间部分.
有人能告诉我我必须使用什么屏幕尺寸以及为什么?
非常感谢!
这是我从教程中复制的代码.代码位于initWithSize方法的myScene.m文件中
SKSpriteNode *background = [SKSpriteNode spriteNodeWithImageNamed:@"myBackground"];
background.position = CGPointMake(CGRectGetMidX(self.frame),CGRectGetMidY(self.frame));
[self addChild:background];
Run Code Online (Sandbox Code Playgroud)
编辑:
我在谷歌搜索并发现了这个:
必须使用"viewWillLayoutSubviews"更改viewDidLoad方法.
这是这个方法:
- (void)viewWillLayoutSubviews
{
[super viewWillLayoutSubviews];
// Configure the view.
SKView * skView = (SKView *)self.view;
skView.showsFPS = YES;
skView.showsNodeCount = YES;
// Create and configure the scene.
SKScene * scene = [MyScene sceneWithSize:CGSizeMake(skView.bounds.size.width*2,skView.bounds.size.height*2)];
scene.scaleMode = SKSceneScaleModeAspectFill;
// Present the scene.
[skView presentScene:scene];
}
Run Code Online (Sandbox Code Playgroud)
起初,scene = MySceneWithSize行是:
SKScene * scene = [MyScene sceneWithSize:skView.bounds.size];
Run Code Online (Sandbox Code Playgroud)
但那时只是iPhone 5屏幕尺寸的一半(568x320).所以我不得不加倍大小.有人知道为什么吗?
我有一个CCSprite,我想用手势移动.问题是我对Cocos2D完全不熟悉.我希望我的精灵在手势开始时执行一个动作,在手势停止时执行另一个动作,在手势正确时执行另一个动作,对左手执行相同操作.有人能指出我正确的方向吗?
谢谢!
只是我遇到的一个问题 - 我有一个SKScene,我在其中使用SKAction类方法播放声音fx
[SKAction playSoundFileNamed:@"sound.wav" waitForCompletion:NO];
Run Code Online (Sandbox Code Playgroud)
现在,当我尝试去背景时,无论声音结束,显然iOS正在终止我的应用程序gpus_ReturnNotPermittedKillClient
.
现在只有当我评论这一行并且没有运行动作时,iOS才能在后台运行它(当然,暂停,但没有终止).
我究竟做错了什么?
编辑:如果没有运行,iOS将不会终止应用程序 - 例如,如果它if statement
没有运行(soundOn == YES)
或类似的东西,当布尔是false
潜入精灵套件(xcode 5).我正在使用两个示例程序,1.创建新项目时包含的默认太空船示例和2.我下载的冒险游戏.
在iOS模拟器中运行这些示例(似乎并不重要).每种帧的帧速率都非常糟糕.如果我在太空船/你好世界的例子中只添加了30个旋转太空飞船,FR会迅速从60 FPS下降到(Ug)12 FPS.
再次,在iOS Sim中运行的Adventure Game示例以10-20 FPS的尖叫速度运行(取决于正在进行的操作).
Apple是否认真对待这些游戏示例?Sprite Kit似乎是垃圾 - 我认为问题是程序员使用Texture Atlas的方式,或者是Sprite Kit(API)处理它们的方式.
有人帮我理解或修复它吗?
在Mavericks,Mac Mini下运行xcode 5 - 我在Unity3D中编程并且在那里没有问题,特别是使用2DToolkit只有30个对象.
我看到某些文本似乎总是将CCSprite子类化.我在某个地方读到这样做并不好,最好从基本的东西开始.我想知道专业游戏开发者在游戏结构方面做了些什么.这是CCSprite的子类或在NSObject类ETC中添加CCSprite.
我希望我的问题有道理.
ios ×4
xcode ×4
sprite-kit ×3
iphone ×2
objective-c ×2
audio ×1
build ×1
debugging ×1
frameworks ×1
git ×1
github ×1
linker ×1
multitasking ×1
opengl-es ×1
runtime ×1
swift2 ×1
xcode4 ×1
xcode5 ×1
xcode7-beta2 ×1