我的Cocoa应用程序有一个Xcode项目.到目前为止,这都是Objective-C.
从菜单添加新的.c文件(添加C文件和标题)后开始出现问题:test.c和header test.h.
当我尝试编译项目时,现在有成千上万的错误.所有这些都是关于语法错误的抱怨.例如:
NSObjCRuntime.h: Expected identifier or '(' before '@' token
Run Code Online (Sandbox Code Playgroud)
这两个新文件,test.c并且test.h不包含任何代码,只有默认的标题注释.我的项目配置必须真正打破一些东西.当我删除这两个文件时,项目编译得很好.
项目语言设置为C99.还有什么我可以检查的吗?
谢谢,马克
我看到很多讨论说我应该使用copy for NSString属性,因为它会阻止其他人在我背后更改它.但那么为什么我们不为它设置只读属性呢?
更新
谢谢回答我的问题.但问题是,对于NSString属性,你总是不希望别人修改它,对吧?您可以自己修改它,但绝对不能修改其他人.我猜大多数时候NSString都会设置它的初始值(由你或其他人设置),之后只有你会修改它.那么为什么不只是使用readonly属性
其实我大部分时间都使用复制品.但后来我发现大部分时间我只在init方法中使用那些setter.所以我认为我应该使用readonly而不是copy来处理这些情况.
因此,让我以这种方式提出问题:如果您只在init方法中使用这些setter作为NSStrings,那么您应该使用readonly.这是一个合理的结论吗?
我有多个线程处理事件.我想为每个事件分配一个纳秒时间戳.但它必须是一个独特的id.因此,在奇怪的情况下,两个事件到达使得它们将被分配相同的时间戳,我希望其中一个增加一纳秒.鉴于实际精度不在纳秒级别,就系统的时间戳性质而言,这是可以的.
在一个帖子中,这是一个微不足道的问题.但是跨越多个线程,它变得更具挑战性.性能是绝对关键的,所以天真地同步典型的id生成器类型的东西的想法似乎会阻止太多.
是否有一些方法可以解决这个问题,只需要很少锁定或不锁定?
我有一个关于使用getter和实例变量的问题.我们来看一个例子吧.
假设我有一个.h文件:
@property (nonatomic,strong) NSString *name
Run Code Online (Sandbox Code Playgroud)
在.m文件中,我以这种方式合成该变量:
@synthesize name = _name;
Run Code Online (Sandbox Code Playgroud)
现在我的问题是:使用之间有什么区别:
[self.name aMethod]
Run Code Online (Sandbox Code Playgroud)
和
[_name aMethod]
Run Code Online (Sandbox Code Playgroud)
谢谢!
我想知道在iOS的cocos2d中分配和释放box2d对象(b2World和b2Body)的最佳方法是什么?
分配
@property (nonatomic, assign) b2World * world;
@property (nonatomic, assign) b2Body * body;
Run Code Online (Sandbox Code Playgroud)
取消分配
-(void)dealloc {
delete _world;
_world = nil;
_body = nil;
Run Code Online (Sandbox Code Playgroud)
有人可以解释为什么我不能使用保留和释放b2World和b2Body,为什么我们在dealloc方法中使用delete _world?为什么我们不删除正文对象呢?(删除_body不起作用).设置指向nil的指针时:我应该使用nil还是NULL?
C++标准库提供std::mutex (lock, unlock, try_lock)了可在多线程环境中工作的功能.
此外,我听说过有关包装库(例如Boost::mutex)的讨论,从我可以看到,它提供了相同的功能(lock, unlock, try_lock).
我的问题是,使用这种包装库比标准库有什么优势?
如果我没有为C++类提供显式的析构函数,因为我确信编译器提供的默认析构函数是我所有类的需求,那很好吗?或者这被认为是不好的做法?
我有一个像这样的抽象基类:
class AbstractBaseClass
{};
Run Code Online (Sandbox Code Playgroud)
从中衍生出来的模板化具体类:
template<class T>
class ConcreteClass : public AbstractBaseClass
{
public:
ConcreteClass(T input) : data(input) {}
private:
T data;
};
Run Code Online (Sandbox Code Playgroud)
我有一个创建AbstractBaseClasses的工厂类
class MyFactory
{
public:
boost::shared_ptr<AbstractBaseClass> CreateBlah();
boost::shared_ptr<AbstractBaseClass> CreateFoo();
template<class T>
boost::shared_ptr<AbstractBaseClass> Create(T input)
{
return boost::shared_ptr<AbstractBaseClass>(new ConcreteClass<T>(input));
}
};
Run Code Online (Sandbox Code Playgroud)
这个问题是,现在使用MyFactory的一切都必须将整个实现包含在ConcreteClass中.理想情况下,除了MyFactory之外我什么都不想了解ConcreteClass.
有没有办法设计这个来实现这个目标?(除了在MyFactory中为我想要的每种类型手动创建一个新的Create函数,而不是模板化它).
我正在尝试扩展一个具有可变方法的类,例如:
- (void)someMethod:(id)arguments, ... ;
Run Code Online (Sandbox Code Playgroud)
并在子类中通过调用原始方法覆盖它,如:
- (void)someMethod:(id)arguments, ... {
[super someMethod:arguments, ...];
// override implementation
...
}
Run Code Online (Sandbox Code Playgroud)
但这不起作用.有谁知道如何工作?谢谢.
在Xcode中,我可以创建一个断点来捕获所有异常(异常断点).然而,这个断点也将在尝试捕获的情况下发射.
我正在使用第三方库,因此try-catch情况是一个事实,而不是一个选项.
有没有办法只处理未捕获的异常,而不是所有异常?
xcode exception-handling breakpoints exception uncaught-exception
objective-c ×5
c++ ×4
ios ×2
properties ×2
xcode ×2
accessor ×1
box2d-iphone ×1
breakpoints ×1
c ×1
dependencies ×1
destructor ×1
exception ×1
factory ×1
haskell ×1
locking ×1
mutex ×1
nsstring ×1
performance ×1
templates ×1
variadic ×1