我一直在教自己Objective-C大约6个月,并喜欢使用这门语言.但是我没有找到任何好的编码标准,所以我写的代码总是看起来像一个不一致的混乱.
像命名约定这样的东西很好,但是间距,缩进和(不可能的?)80字符的行宽并没有那么好.
您对Objective-C使用哪些约定?
这是一个不起作用的小例子:
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil {
if ((self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil])) {
self.navigationItem.leftBarButtonItem =
[[[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemCancel
target:self.parentViewController
action:@selector(done:)] autorelease];
NSString* units = [[NSString alloc] initWithFormat:@"%@", @"oz"];
NSString* optionOne = [[NSString alloc] initWithFormat:@"[%d%@] Calculate", 100, units];
self.options = [[NSMutableArray alloc] initWithObjects:
optionOne,
@"Configure Portions",
@"Configure Notifications",
@"Help",
nil];
[units release];
[optionOne release];
[tableView reloadData];
}
return self;
}
Run Code Online (Sandbox Code Playgroud) 我正在尝试混合使用C++和Objective-C,我已经完成了大部分工作,但希望在Objective-C和C++代码之间有一个单独的接口类.因此,我想在ViewController接口中拥有一个持久的C++对象.
禁止使用没有类型的'myCppFile'声明失败:
#import <UIKit/UIKit.h>
#import "GLView.h"
#import "myCppFile.h"
@interface GLViewController : UIViewController <GLViewDelegate>
{
myCppFile cppobject;
}
@end
Run Code Online (Sandbox Code Playgroud)
但是这在.mm实现文件中运行得很好(它不起作用因为我希望cppobject在调用之间保持不变)
#import "myCppFile.h"
@implementation GLViewController
- (void)drawView:(UIView *)theView
{
myCppFile cppobject;
cppobject.draw();
}
Run Code Online (Sandbox Code Playgroud) 我一直在使用UIViewControllers并initWithNibName取得了很大的成功,基本上使用它们作为使用Interface Builder设计视图的便捷方式.不幸的是,我在UIViewController文档中注意到这一行之前构建了一个视图层次结构:
注意:您不应使用视图控制器来管理仅填充其窗口一部分的视图
我的问题是:拥有一个非常简单的NIB,UIView除了默认的First Responder和Owning Object之外,还有一个最简单的加载UIView到我的代码中的方法是什么?
我此时无法loadNibNamed:owner:options:上班,但怀疑答案会以某种方式涉及到它.
使用自动完成填充方法参数时,大多数时候最后应该有分号.
似乎必须有一些键盘快捷键放在分号(也许是换行符)的末尾,但我找不到它!
谢谢.
编辑:也许问题不明确,当完成自动完成方法时,光标看起来像这样:
someMethod(argument1, argument2 )
^ cursor here
Run Code Online (Sandbox Code Playgroud)
也许这只是因为我不习惯macbook键盘,或者因为我的肌肉记忆想要使用"结束"而不是右箭头或命令右箭头.但是由于IDE已经帮助我使用tab跳转代码,所以能够返回并添加分号或者至少移动到close paren的右边会很好.
据我所知,升级到iPhone OS将OpenGL ES版本支持从1.1升级到2.0.我无法找到的是,是否应该努力使用1.1来向后兼容旧设备.
Xcode似乎建议我使用2.0,因为它似乎只包含该版本.
我应该使用2.0而不回头吗?有哪些设备只能使用1.1?
谢谢.
我有一个看起来像这样的类:
class MeshClass
{
public:
Anchor getAnchorPoint(x, y)
{
return Anchor( this, x, y );
}
private:
points[x*y];
}
Run Code Online (Sandbox Code Playgroud)
我想创建另一个代表"锚"点的类,它可以访问Mesh并修改点,如下所示:
class Anchor
{
public:
Anchor(&MeshClass, x, y)
moveAnchor(x, y);
}
Run Code Online (Sandbox Code Playgroud)
问题是当我尝试Anchor在MeshClass::getAnchorPoint方法中做出类似的东西,return Anchor(this, x, y)但因为this是const我不能.作为一种解决方法,直到我弄明白这一点,我让Anchor接受对该点的引用,并且moveAnchor直接移动该点.
编辑:问题很可能是我尝试使用Reference时所做的事情.我改为使用像往常一样的指针,我可以传入this,没有来自编译器的抱怨.我几乎可以肯定我得到了一个与const相关的错误,但是我无法重新创建它,所以我必须忘记这一点.
我有三个类实现相同的协议,并具有相同的父类,不实现协议.通常我会将协议作为父类中的纯虚函数,但我找不到Objective-C方法来做到这一点.
我想通过在超类中声明纯虚函数然后让子实现这些函数来利用这些子类的多态性.然而,我发现这样做的唯一Objective-C方法是让每个孩子明确决定实现一个协议,当我这样做时,超类不知道孩子们将实现该协议,所以有编译时警告到处都是.
一些伪代码如果没有意义:
@interface superclass: NSObject
{}
@interface child1: superclass<MyProtocol>
{}
@interface child2: superclass<MyProtocol>
{}
Run Code Online (Sandbox Code Playgroud)
这些类的消费者:
@class child1
@class child2
@class superclass
@interface SomeViewController: UIViewController
{
child1 *oneView;
child2 *otherView;
superclass *currentView;
}
-(void) someMethod
{
[currentView protocolFunction];
}
Run Code Online (Sandbox Code Playgroud)
我发现在Objective-C中执行纯虚函数的唯一好方法是通过放入[self doesNotRecognizeSelector:_cmd];父类来实现,但它并不理想,因为它会导致运行时错误而不是编译时间.
我正在将一些代码移植到Windows并且很难过.还有的是,在启动自动运行的指针复制到一个指针,而退出再次运行删除指针的指针,如果它不为空一些代码.
我创建了一个示例程序来重现行为
int main()
{
// Pointer to a Pointer, current crash.
InterfaceClass** ptrptr;
ConcreteTwo* object = new ConcreteTwo();
ptrptr = (InterfaceClass**)(&object); // cast is required for some reason.
delete *ptrptr; // Crash here.
// Single pointer, works fine.
InterfaceClass* ptrptr;
ConcreteTwo* object = new ConcreteTwo();
ptrptr = object;
delete ptrptr;
// There are other cases where there are only 3 classes in the hierarchy.
// This also works fine.
InterfaceClass** ptrptr;
ConcreteOne* object = new ConcreteOne();
ptrptr = (InterfaceClass**)(&object); …Run Code Online (Sandbox Code Playgroud) 我正在使用应用程序框架(Netbeans 平台)在 Java 中构建 GUI 应用程序,该框架需要大量几乎相同的类来实现极其相似的Action类。我花了很多时间尝试以编程方式生成这些操作。尽管我能够生成操作,但该框架在编译时利用注释来生成其他内部缓存/数据文件,而我无法使用编程方法重现这些文件。
我想知道代码生成工具是否是更好的解决方案,或者可能是一些包装框架注释的自定义注释。也许是类似的东西Lombok,或者也许是一个 Maven 插件。但不知道从哪里开始,也不确定这是否是一条很好的探索之路。理想情况下,我认为在数据文件中定义操作并在编译时生成 java 代码会很棒。
该项目是开源的,许多其他操作都在 github 上。这是模板的示例,我需要注入的部分替换为{{string}},{{code}}和{{int}}:
// imports omitted
@ActionID(
category = {{string}},
id = {{string}})
@ActionRegistration(
iconBase = {{string}},
displayName = "resources.MessagesBundle#" + {{string}},
lazy = false)
@ActionReferences({
@ActionReference(
path = {{string}},
position = {{int}})
})
public final class {{string}} extends AbstractAction implements UGSEventListener {
public static final String ICON_BASE = {{string}};
private BackendAPI backend;
public SoftResetAction() {
this.backend …Run Code Online (Sandbox Code Playgroud) 我正在使用由Xcode自动生成的以下NSManagedObject:
@interface Portion : NSManagedObject
{
}
@property (nonatomic, retain) NSNumber * volume;
Run Code Online (Sandbox Code Playgroud)
我想创建一个自定义getter/setter,根据用户设置的内容在ml/oz之间进行转换,数据库始终存储相同的值,并自动转换为首选单位.我最近的尝试看起来像这样:
#import "Portion.h"
#import "SettingHandler.h"
#define MILLILITERS_PER_OUNCE 29.5735296
@implementation Portion
@dynamic volume;
- (void) setVolume:(NSNumber *) number {
if ([SettingHandler getUnitsTypeShort] == @"oz") {
[self setValue:number forKey:@"volume"];
} else {
[self setValue:[NSNumber numberWithFloat:[number floatValue] * MILLILITERS_PER_OUNCE] forKey:@"volume"];
}
}
- (NSNumber *) volume {
if ([SettingHandler getUnitsTypeShort] == @"oz") {
return [self valueForKey:@"volume"];
} else {
return [NSNumber numberWithDouble: [[self valueForKey:@"volume"] floatValue] * MILLILITERS_PER_OUNCE];
}
}
Run Code Online (Sandbox Code Playgroud)
setVolume调用最终调用自身导致无限循环.我猜有一种方法可以做到这一点,但我不知道它是什么,有什么想法吗?
我注意到有很多的Objective-C的实例将转发与@class声明类,那么实际导入与进口.m文件的类.我理解这被认为是最佳实践,如问题答案中所述:@class vs. #import
来自C++,这感觉倒退了.我通常会在新类头文件中包含所有需要的.h文件.这似乎是有用的,因为它会导致编译器生成一个警告,当两个类互相包含,在这一点上,我可以决定这是否是一件坏事或不然后用同样的Objective-C的风格和向前在头声明类和将它包含在.cpp文件中.
前向声明@class并在实现文件中导入有什么好处?在C++中转发声明类而不是包含头文件应该是最佳实践吗?或者从这些类似的术语开始考虑Objective-C和C++是错误的吗?
objective-c ×6
c++ ×4
iphone ×4
autocomplete ×1
coding-style ×1
core-data ×1
ide ×1
java ×1
nib ×1
opengl-es ×1
polymorphism ×1
uiview ×1
windows ×1
xcode ×1