我目前正在使用许多与自定义方法相同的子类对象。 创建我自己的库可以更方便,我可以用于多个项目。
目标是让我自己的类与UIView
,CGRect
等类一样可用,包括方便的方法,如CGRectMake
,包括类和结构。总结一下,我想创建自己的等价物:
UIView
CGRect
CGRectMake
所以基本上我正在寻找有关如何创建类,结构等的说明,以便创建上述所有内容。 这样做的最佳方式是什么? 320 project似乎是一个很好的起点。但它缺乏(我认为):
即使我要创建自己的静态库,我是否能够在应用商店发布该应用,因为手机不支持链接到第三方库?
为方便起见,这些基本上是子问题,涵盖了这个问题的范围:
答案 0 :(得分:18)
FYI Xcode 3.2有一个名为Cocoa Touch Static Library的新项目模板。你可能想要走那条路。
答案 1 :(得分:16)
如果你是为Mac做这个,你就要创建一个框架。但是,你提到了UIView
,所以显然你正在使用iPhone。 Apple不允许iPhone应用程序在运行时动态链接其他库,因此您唯一的选择是创建静态库。静态库在构建时链接到应用程序可执行文件中。
据我所知,Xcode中没有静态库项目模板。您可能需要做的是从另一个iPhone Xcode模板开始并添加静态库目标。继续使用默认的应用程序目标;您可以使用它来构建一个简单的测试应用程序,以确保库实际工作。
要在应用程序中实际使用该库,您需要两件事:编译库(它具有.a扩展名)和所有头文件。在完成的应用程序中,您将链接到静态库,并且您需要#import
头文件,以便编译器了解可用的类,函数等。 (一种常见的技术是创建一个导入所有其他文件的头文件。这样,您只需要在源文件中导入一个文件。)
至于创建自己的自定义模板,这里有一个简单的教程可以帮助您入门:http://www.macresearch.org/custom_xcode_templates您可以复制默认模板,并根据您的目的自定义它们。
struct语法如下所示:
typedef struct _MyPoint {
CGFloat x;
CGFloat y;
} MyPoint;
结构是在头文件中声明的,因此您可以(我相信)Command + Double单击结构的名称以查看它是如何声明的。
创建结构的另一个小技巧是做这样的事情:
MyPoint aPoint = (MyPoint){ 1.5f, 0.25f };
因为编译器知道结构中字段的顺序,所以它可以非常容易地将您在花括号中提供的值与相应的字段进行匹配。当然,拥有像MyPointMake
这样的函数会更方便,所以你可以像这样编写:
MyPoint MyPointMake(CGFloat x, CGFloat y)
return (MyPoint){ x, y };
}
请注意,这是一个函数,而不是一个方法,因此它位于任何@interface
或@implementation
上下文之外。虽然我不认为如果你在@implementation
上下文中定义它,编译器会抱怨。
CGPointMake
被定义为所谓的inline
函数。您也可以在Cocoa头文件中看到该定义。 (内联函数和普通函数之间的区别在于编译器可以使用CGPointMake
的副本将调用替换为CGPointMake
,避免进行函数调用的开销。这是一个非常小的优化,但对于一个简单的函数,它是有道理的。)
答案 2 :(得分:4)
320 project是iPhone类库的一个很好的例子。您基本上将项目编译为.a库,然后在客户端项目中静态链接。
答案 3 :(得分:2)
由于这是一个社区维基,我认为链接一些资源和教程会很有帮助:
http://blog.stormyprods.com/2008/11/using-static-libraries-with-iphone-sdk.html
http://www.clintharris.net/2009/iphone-app-shared-libraries/
享受!
答案 4 :(得分:1)
320项目确实是一个很好的起点。但它缺乏(我认为):
- 立即在新项目中提供图书馆
- 在“新文件”下提供新课程
这些是项目和文件模板。有关详细信息,请ask the Google。
答案 5 :(得分:0)
如果您计划在应用商店发布此功能,则无法以您希望的方式使用您的库。如上所述,手机不支持链接到第三方库。我认为有一种“黑客”方式可以让它发挥作用,但你会失去分发。
我能想到的最好的方法是将所有相关代码放在一个目录中并以这种方式共享。我知道它不那么优雅,但它的限制就是。我们无法控制。