为Cocoa(touch)开发创建自己的库的指南

为Cocoa(touch)开发创建自己的库的指南,c,xcode,oop,frameworks,C,Xcode,Oop,Frameworks,我目前正在使用许多与自定义方法相同的子类对象。创建我自己的库会更方便,我可以将它用于多个项目 我们的目标是让我自己的类可以像UIView、CGRect等类一样使用,包括CGRectMake等方便的方法,包括类和结构。总而言之,我想创建我自己的等价物: 类,如UIView 结构,如CGRect 方便的功能,如CGRectMake 将此作为图书馆提供 将其作为XCode模板提供,从而使这些自定义对象在XCode中作为“新文件”提供 因此,基本上我在寻找如何创建类、结构等的说明,以便创建上述所有内

我目前正在使用许多与自定义方法相同的子类对象。创建我自己的库会更方便,我可以将它用于多个项目

我们的目标是让我自己的类可以像
UIView
CGRect
等类一样使用,包括
CGRectMake
等方便的方法,包括类和结构。总而言之,我想创建我自己的等价物:

  • 类,如
    UIView
  • 结构,如
    CGRect
  • 方便的功能,如
    CGRectMake
  • 将此作为图书馆提供
  • 将其作为XCode模板提供,从而使这些自定义对象在XCode中作为“新文件”提供
因此,基本上我在寻找如何创建类、结构等的说明,以便创建上述所有内容最好的方法是什么?这似乎是一个很好的起点。但它(我认为)缺乏:

  • 立即在新项目中提供该库
  • 在“新文件”下提供新类
即使我要创建一个自己的静态库,我是否能够在应用商店上发布应用,因为手机不支持链接到第三方库

为方便起见,这些基本上是子问题,涵盖了本问题的范围:

  • 如何为Mac/iPhone开发创建自己的库?
  • 如何为此库创建类、结构和内联函数?
  • 如何基于此库创建自己的Xcode模板?
  • 我能否使用自己的静态库发布iPhone应用程序?

    • 是iPhone类库的一个很好的例子。基本上,您可以将项目向下编译到.a库中,然后在客户端项目中对此进行静态链接

      如果你是为Mac电脑这样做的,你应该创建一个框架。但是,您提到了
      UIView
      ,因此显然您正在使用iPhone。苹果不允许iPhone应用程序在运行时动态链接到其他库,所以您唯一的选择就是创建一个静态库。静态库在构建时链接到应用程序可执行文件中

      据我所知,Xcode中没有静态库项目模板。您可能需要做的是从一个不同的iphonexcode模板开始,添加一个静态库目标。挂起默认的应用程序目标;您可以使用它来构建一个简单的测试应用程序,以确保库实际工作

      要在应用程序中实际使用该库,您需要两样东西:编译后的库(扩展名为.a)和所有头文件。在完成的应用程序中,您将链接到静态库,并且需要导入头文件,以便编译器了解哪些类、函数等可用。(一种常见的技术是创建一个头文件来导入所有其他头文件。这样,您只需要在源文件中导入一个文件。)

      至于创建您自己的自定义模板,这里有一个简单的教程可以让您开始:您可能可以复制默认模板,然后自定义它们以满足您的目的

      结构语法如下所示:

      typedef struct _MyPoint {
          CGFloat x;
          CGFloat y;
      } MyPoint;
      
      MyPoint aPoint = (MyPoint){ 1.5f, 0.25f };
      
      MyPoint MyPointMake(CGFloat x, CGFloat y) 
          return (MyPoint){ x, y };
      }
      
      结构是在头文件中声明的,所以您可以(我相信)命令+双击结构的名称来查看它是如何声明的

      创建结构的另一个小技巧是执行以下操作:

      typedef struct _MyPoint {
          CGFloat x;
          CGFloat y;
      } MyPoint;
      
      MyPoint aPoint = (MyPoint){ 1.5f, 0.25f };
      
      MyPoint MyPointMake(CGFloat x, CGFloat y) 
          return (MyPoint){ x, y };
      }
      
      因为编译器知道结构中字段的顺序,所以可以很容易地将大括号中提供的值与适当的字段进行匹配。当然,使用类似于
      MyPointMake
      的函数更方便,因此您可以这样编写:

      typedef struct _MyPoint {
          CGFloat x;
          CGFloat y;
      } MyPoint;
      
      MyPoint aPoint = (MyPoint){ 1.5f, 0.25f };
      
      MyPoint MyPointMake(CGFloat x, CGFloat y) 
          return (MyPoint){ x, y };
      }
      
      请注意,这是一个函数,而不是一个方法,因此它位于任何
      @接口
      @实现
      上下文之外。尽管我认为如果在
      @实现
      上下文中定义它,编译器不会抱怨

      CGPointMake
      被定义为
      inline
      函数。您也可以在Cocoa头文件中看到它的定义。(内联函数和普通函数的区别在于,编译器可以用
      CGPointMake
      的副本替换对
      CGPointMake
      的调用,这避免了函数调用的开销。这是一个非常小的优化,但对于这么简单的函数来说,这是有意义的。)

      320项目看起来确实是一个很好的起点。但它(我认为)缺乏:

      • 立即在新项目中提供该库
      • 在“新文件”下提供新类

      这些是项目和文件模板。有关更多信息,请参见。

      如果您计划在app store上发布此应用程序,您将无法以您希望的方式使用库。如上所述,手机不支持链接到第三方库。我认为有一种“黑客”方法可以让它工作,但你会失去分发


      我能想到的最好办法就是把所有相关的代码放在一个目录中并以这种方式共享。我知道它没有那么优雅,但这是它们的局限性,即超出了我们的控制。

      由于这现在是一个社区维基,我认为链接一些资源和教程会很有帮助:


      享受吧

      FYI Xcode 3.2有一个名为Cocoa Touch静态库的新项目模板。你可能想走那条路。

      我查过了,但我似乎不太明白。你能详细解释一下吗?他在这里给出了非常详细的指示:你到底不明白什么?我不知道怎么做