我已经看到了一些在Objective-C中声明半私有方法的策略,但似乎没有办法制作一个真正的私有方法.我接受.但是,为什么会这样呢?我基本上所说的每一个解释,"你不能这样做,但这里有一个近似的近似."
有许多适用于关键字的ivars(部件)控制它们的范围,例如@private,@public,@protected.为什么不能这样做呢?它似乎是运行时应该能够支持的东西.我缺少一种潜在的哲学吗?这是故意的吗?
假设我正在为Objective-C中的iPhone构建一个新类.在我的一个init方法中,我想手动分配一些内存.所以,我可能有这样的事情:
- (id)initWithSomeObject:(SomeObject *)someObject {
self = [super init];
if (self != nil) {
myObject = someObject;
[myObject retain];
if ( (memory = calloc(1, sizeof(SomeStruct)) == NULL) {
// What should I do here to clean up
[self release];
self = nil;
}
}
return self;
}
Run Code Online (Sandbox Code Playgroud)
现在,假设calloc()可能失败,并且无法分配内存对我的对象来说是灾难性的,我应该在if-body内做什么来正确清理?是否存在我应该使用的Objective-C习语或模式?
编辑:我收录了Rob Napier发布的代码.但是,我还是要释放myObject,对吧?或者添加的代码是否以某种方式触发dealloc()?
我是一名开发人员,正在从Linux/Emacs过渡到OSX/Xcode.有没有人有任何关于平滑文本编辑过渡的提示或建议?特别:
Emacs的习惯在转换时引起了最大的痛苦,即你是否因为Emacs背景而反复出现了什么错误?
有没有办法使Xcode的工作方式相似,还是需要改变行为?
你有没有从Emacs中得到的任何你无法进入Xcode的东西?
我最感兴趣的是它的文本编辑器部分,例如键绑定,分割窗口,在缓冲区之间移动等等......我从未在IDE意义上使用过Emacs.它总是一个纯文本编辑器给我.编译发生在另一个shell中.同样适用于SCM的东西.
自从我升级到Xcode 4.5后,我发现它会自动删除我访问的每个xib文件的一部分.这是部分:
<object class="NSMutableDictionary" key="IBDocument.PluginDeclaredDependencyDefaults">
<string key="NS.key.0">com.apple.InterfaceBuilder.CocoaTouchPlugin.iPhoneOS</string>
<real value="1536" key="NS.object.0"/>
</object>
Run Code Online (Sandbox Code Playgroud)
我几乎可以忍受这个,但当我再次访问该文件时,我发现还有更多的"自动"更改.它们更加多样化,更难以描述,因此除非我真的需要,否则我不会包含示例.
我不明白这里发生了什么.我正在寻找两个答案之一:
如果我只是明白到底发生了什么以及为什么,我会感觉好多了.
假设我有一个类声明为:
@class SomeClass
@interface SomeClass: NSObject {
NSString *myString;
NSString *yourString;
}
@end
Run Code Online (Sandbox Code Playgroud)
后来,在其他一些代码中我说:
SomeClass *myClass = [[SomeClass alloc] init];
Run Code Online (Sandbox Code Playgroud)
SomeClass如何知道要分配多少内存,因为它没有覆盖+ alloc?据推测,它需要存储ivars myString和yourString,但它使用的是继承自NSObject的+ alloc.是否有参考资料涵盖这些细节?
我正在开发一款严重依赖OpenGL的iPhone App.现在它在iPhone 3G上运行有点慢,但在新的32G iPod Touch上看起来很快.我认为这与硬件有关.无论如何,我想让iPhone的性能与iPod Touch的性能相似.我相信我在OpenGL中做了很多次优化的事情,我想知道哪些改进会给我带来最大的好处.
我的场景渲染是这样的:
我的顶点,法线和纹理坐标已经交错.
那么,我应该采取什么措施加快速度呢?你先做什么步骤?
我的第一个想法是使用Texture Atlas消除所有那些glBindTexture()调用.
一些更有效的矩阵运算怎么样?我理解gl*()版本效率不高.
维多利亚州立大学呢?
更新
有8260个三角形.纹理大小为64x64 png.有58种不同的纹理.
我没有运行乐器.
更新2
在iPhone 3G上运行OpenGL ES仪器后,我发现我的Tiler利用率在90-100%范围内,我的渲染利用率在30%范围内.
更新3
纹理图集对问题没有明显的影响.使用范围仍然如上所述.
更新4
将我的Vertex和Normal指针转换为GL_SHORT似乎可以提高FPS,但Tiler利用率在很多时候仍然在90%的范围内.我仍在使用GL_FLOAT作为纹理坐标.我想我可以将它们击倒到GL_SHORT并为每个顶点节省四个字节.
更新5
将我的纹理坐标转换为GL_SHORT会产生另一个性能提升.我现在一直都超过30 FPS.Tiler利用率仍然在90%左右,但经常在70-80%的范围内下降.渲染器利用率徘徊在50%左右.我想这可能与从GL_TEXTURE矩阵模式缩放纹理坐标有关.
我还在寻求其他改进.我想接近40 FPS,因为这就是我的iPod Touch所带来的,它在那里如丝般顺滑.如果有人还在关注,我还能选择哪些其他低调的水果?
我试图从我的iPhone OpenGL ES应用程序中挤出一些性能提升.根据Instruments的说法,我的贴片机使用率在大多数情况下接近100%,我的FPS大约是24.我想让我的FPS达到30以上.我可以通过将GL_FLOAT转换为GL_SHORT来达到目标,但是对我来说,技术问题相当令人生畏.我宁愿不去那里.
所以,我正在考虑从glDrawArrays()切换到glDrawElements().我有35个网格由708个顶点组成,但很多这些顶点在面之间共享.我是纹理贴图,但网格颜色大致均匀.需要特殊纹理的面将保留原样.
假设我可以将顶点数减少一半.让我们也说我也以对iPhone有意义的方式组织我的几何:比如说,使用Imagination Technologies PVRTTriStrip工具.忽略索引数组的少量额外内存,这意味着我大致将内存带宽减少了一半,所以我应该看到相当不错的性能提升.
这是真的,还是我错过了或误解了什么?建议表示赞赏.
根据这个问题的一些答案,似乎+ alloc在Objective-C中为一个对象的实例分配内存做了一些幕后魔术.是否需要覆盖+ alloc?
我在门户网站上找不到此信息,也无法在其知识库中找到任何信息.如果真的失踪了,这似乎是一个相当大的盲点.
iphone ×4
objective-c ×4
opengl-es ×3
crashlytics ×1
emacs ×1
ios ×1
macos ×1
xcode ×1
xcode4.5 ×1
xib ×1