Token导航 LogoToken导航

Agent Skill · 前端设计

objective-c-language(目标 c 语言)

objective-c-language 用于处理 GitHub 仓库、Issue、Pull Request 和代码协作信息,适合在 Codex、Claude、Cursor、Gemini CLI 中需要围绕仓库状态、代码变更或协作事项进行整理时使用。可结合来源仓库、安装命令和原始 README 继续核验具体用法。安装前建议确认权限范围、维护状态,以及是否会触发联网、命令执行或文件读写。

objective-c-language 是前端设计类 Agent Skill,可用宿主为 Codex、Claude、Cursor、Gemini CLI,通过GitHub 仓库获取,权限为需要联网;许可证信息还不明确,第三方扫描有未通过项,按安装量在前端设计类的 10,216 个 Skill 里排第 8,797。

总安装 259周安装 11GitHub Stars 4下载 91核验 2026-05-01

安装说明

本站只整理中文说明,不托管安装包,也不代用户安装。
GitHub
许可证
unknown

安装方式

通过对话安装

复制提示词发给支持本地命令或 Skills 的 AI 助手,先确认命令和权限,再让它执行。

请帮我安装这个 Agent Skill:objective-c-language(目标 c 语言)
来源仓库:https://github.com/creeveliu/ios-skills
仓库路径:skills/objective-c-language
安装命令:
npx skills add https://github.com/creeveliu/ios-skills --skill objective-c-language
安装前请先检查当前环境是否支持对应 CLI,并向我确认将要执行的命令、安装目录、联网范围和文件读写权限;确认后再执行。

命令行安装

复制命令到本机终端执行。该命令会通过 npx skills 从第三方来源获取 Skill;本站只展示命令,不托管安装包,也不自动执行。

skills.shnpx skills
npx skills add https://github.com/creeveliu/ios-skills --skill objective-c-language

这个 Skill 是做什么的

前端设计类 Skill 关注页面结构、视觉规范和组件写法,输出通常是可运行的界面代码。

Objective-C 语言用于处理 GitHub 仓库、Issue、Pull Request 和代码协作信息。适用于需要围绕仓库状态、代码变更或协作事项进行整理的场景,如代码审查、项目管理等。通过 GitHub 仓库安装,使用 npx skills add 命令添加技能,需确认权限和维护状态。

使用前应检查是否会触发联网、命令执行或文件读写,确保符合项目安全策略。objective-c-language 属于前端设计类 Skill,可作为该场景下的辅助能力补充。

来源仓库内路径:skills/objective-c-language

上手步骤

4 步
  1. 1

    确认自己的宿主工具

    公开资料标注支持 Codex、Claude、Cursor、Gemini CLI;先确认自己用的是其中之一,再按对应工具的 Skills 目录放置。

  2. 2

    拿到安装命令

    可以直接复制的命令是 npx skills add https://github.com/creeveliu/ios-skills --skill objective-c-langu…;命令里的占位符换成自己的路径或密钥再执行。

  3. 3

    安装后重启宿主

    命令执行完要完全退出宿主工具再打开,让新装的 Skill 被重新扫描到,否则列表里可能看不到。

  4. 4

    按最小权限试用

    它需要需要联网,先在测试目录或测试账号里跑,确认没问题再放到正式项目。

常见问题

6 条

objective-c-language 怎么安装?

在终端执行 npx skills add https://github.com/creeveliu/ios-skills --skill objective-c-language。装完完全退出宿主工具再打开,让它重新扫描本地 Skill。

objective-c-language 支持哪些 AI 工具?

公开资料标注支持 Codex、Claude、Cursor、Gemini CLI。其他工具只要能读取本地 Skill 目录,一般也能手动放进去,但要自己确认触发方式是否一致。

objective-c-language 需要什么权限?

权限级别是需要联网。该 Skill 可能需要联网访问来源站点、仓库或外部 API;具体网络访问范围需要结合源码和 README 复核。

objective-c-language 是免费的吗?

公开资料没有标注明确许可证,收费和商用限制都无法确认。正式使用前请到来源仓库核对授权说明。

objective-c-language 用的人多吗?

公开数据是累计安装 259 次,近一周安装 11 次,下载 91 次,GitHub 4 星。这些数字来自第三方目录统计,只能当作热度参考,不代表质量或安全性。

objective-c-language 安全吗?

第三方扫描有未通过项,风险较高。除非你确认过源码,否则不建议直接安装到常用环境。

值得选的地方和要先想清楚的地方

值得选的地方

  • 同时适配 4 种工具,换客户端不用重新找替代品。

先想清楚的地方

  • 许可证没有明确标注,能不能商用、能不能再分发都不确定。
  • 第三方扫描存在提醒项或未通过项,需要人工逐条确认。
  • 第三方目录整理,版本更新和行为细节以来源仓库为准。

适不适合你

更适合

  • 已经在用 Codex,想直接扩展它能力的人。
  • 需要处理前端设计类任务、又不想每次都手写提示词的人。

不太适合

  • 需要明确授权才能用到公司项目里的场景。
  • 需要厂商级技术支持和 SLA 的生产系统。

前端设计类 Skill 对比

6 个同类
Skill总安装GitHub 星权限许可证扫描
frontend-design

前端设计 · Codex、Claude

8,823,360126,072只读MIT通过
vercel-composition-patterns

Vercel 组合模式 · Codex、Claude

3,858,81625,893需要联网MIT通过
vercel-react-native-skills

Vercel React native skills 前端 · Codex、Claude

2,468,66425,878只读MIT通过
adapt

adapt 搜索 · Codex、Claude

2,027,04023,125操作浏览器未明确通过
bolder

bolder 分析 · Codex、Claude

2,004,28823,130只读未明确通过
objective-c-language

目标 c 语言 · 本页

2594需要联网未明确未通过

按安装量取同分类前几名;数字来自第三方目录统计,只作热度参考,不代表质量结论。

SKILL.md 原文

Objective-C 最佳实践

本技能提供 Objective-C 编码的标准工作流程和最佳实践。

核心原则

  1. 现代 Objective-C - 使用现代语法糖和特性
  2. ARC 内存管理 - 正确使用自动引用计数
  3. 轻量级泛型 - 提高类型安全性
  4. Block 安全 - 避免循环引用
  5. Swift 互操作 - 为 Swift 调用设计 API

内存管理

ARC 基础规则

// ✅ 正确:使用强引用默认
@property (nonatomic, strong) NSString *name;
@property (nonatomic, strong) NSArray *items;

// ✅ 正确:避免循环引用时使用 weak
@property (nonatomic, weak) id<Delegate> delegate;
@property (nonatomic, weak) IBOutlet UIView *contentView;

// ✅ 正确:Block 属性使用 copy
@property (nonatomic, copy) void (^completionBlock)(BOOL success);

// ❌ 错误:Block 属性使用 strong(会导致循环引用)
@property (nonatomic, strong) void (^completionBlock)(BOOL success);

Block 中的内存管理

// ✅ 正确:使用 weak-strong dance
__weak typeof(self) weakSelf = self;
self.completionBlock = ^(BOOL success) {
    typeof(self) strongSelf = weakSelf;
    if (strongSelf) {
        [strongSelf handleResult:success];
    }
};

// ✅ 正确:简单场景可仅用 weak
[networkManager fetchDataWithCompletion:^(id result) {
    [weakSelf updateUIWithResult:result];
}];

// ❌ 错误:直接使用 self 可能导致循环引用
[networkManager fetchDataWithCompletion:^(id result) {
    [self updateUIWithResult:result];  // self 被 block 强引用
}];

集合类内存管理

// ✅ 正确:使用可变集合的 copy
- (void)setItems:(NSArray *)items {
    _items = [items copy];  // 防止外部修改
}

- (void)addObserver:(id)observer {
    if (!_observers) {
        _observers = [NSMutableArray array];
    }
    [_observers addObject:observer];
}

// ✅ 正确:KVO 移除要配对
- (void)dealloc {
    for (id observer in _observers) {
        [observer removeObserver:self forKeyPath:@"status"];
    }
}

语言特性

Category(类别)

// ✅ 正确:Category 命名使用公司/模块前缀
// NSString+JSON.h
@interface NSString (JSON)
- (NSDictionary *)json_decodedDictionary;
@end

// ✅ 正确:使用 Class Extension 添加私有属性
// MyClass.m
@interface MyClass ()
@property (nonatomic, strong) UIView *privateView;
@property (nonatomic, assign) BOOL isLoading;
- (void)privateMethod;
@end

@implementation MyClass
- (void)privateMethod {
    // 私有实现
}
@end

// ❌ 错误:在 Category 中添加属性(无法合成实例变量)
@interface NSString (Bad)
@property (nonatomic, strong) id data;  // 危险!
@end

Protocol(协议)

// ✅ 正确:协议使用 weak 引用避免循环引用
@protocol DataSourceDelegate <NSObject>
- (void)didUpdateData:(id)sender;
@optional
- (void)willBeginLoading:(id)sender;
@end

@interface DataSource : NSObject
@property (nonatomic, weak) id<DataSourceDelegate> delegate;
@end

// ✅ 正确:检查 delegate 响应方法
- (void)finishLoading {
    if ([self.delegate respondsToSelector:@selector(didUpdateData:)]) {
        [self.delegate didUpdateData:self];
    }
}

// ✅ 正确:使用协议组合
@protocol TableViewDataSource <NSObject>
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section;
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath;
@end

Notification(通知)

// ✅ 正确:使用 block 方式接收通知(iOS 10+)
[self.notificationCenter addObserverForName:UIKeyboardWillShowNotification
                                     object:nil
                                      queue:[NSOperationQueue mainQueue]
                                 usingBlock:^(NSNotification *note) {
    [self handleKeyboardShow:note];
}];

// ✅ 正确:传统方式需要在 dealloc 移除
- (void)viewDidLoad {
    [super viewDidLoad];
    [[NSNotificationCenter defaultCenter] addObserver:self
                                             selector:@selector(handleNotification:)
                                                 name:UISystemTimeZoneDidChangeNotification
                                               object:nil];
}

- (void)dealloc {
    [[NSNotificationCenter defaultCenter] removeObserver:self];
}

// ❌ 错误:忘记移除观察者(可能导致崩溃)
- (void)dealloc {
    // 缺少 removeObserver
}

Swift 混编

为 Swift 设计 API

// ✅ 正确:使用 NS_SWIFT_NAME 提供友好的 Swift 名称
@interface APIManager : NSObject
- (void)fetchUserData:(void (^)(NSDictionary * _Nullable data, NSError * _Nullable error))completion
NS_SWIFT_NAME(fetchUser(completion:));
@end

// Swift 调用:apiManager.fetchUser { data, error in ... }

// ✅ 正确:使用 NS_REFINED_FOR_SWIFT 隐藏原始 API
@interface Config : NSObject
@property (nonatomic, copy) NSString *apiKey NS_REFINED_FOR_SWIFT;
@end

// Swift 中通过 _objc_ 前缀访问原始 API

// ✅ 正确:使用 NS_ERROR_ENUM 提供 Swift Error
typedef NS_ERROR_ENUM(APIErrorDomain, APIError) {
    APIErrorUnknown = 0,
    APIErrorNetworkUnavailable = 1,
    APIErrorUnauthorized = 2,
} NS_SWIFT_NAME(APIManager.Error);

泛型支持

// ✅ 正确:使用轻量级泛型
@interface Repository<ObjectType> : NSObject
- (void)addItem:(ObjectType)item;
- (ObjectType)itemAtIndex:(NSInteger)index;
- (NSArray<ObjectType> *)allItems;
@end

// Swift 中:Repository<String>

// ✅ 正确:使用类型约束
@interface Collection<ElementType: id<NSCopying>> : NSObject
- (void)addCopy:(ElementType)item;
@end

可选类型映射

// ✅ 正确:使用 nullable/unspecified/null_resettable
@interface User : NSObject
@property (nonatomic, copy, nullable) NSString *nickname;  // Swift: String?
@property (nonatomic, copy, nonnull) NSString *userId;     // Swift: String
@property (nonatomic, strong, null_resettable) NSArray *tags;  // Swift: [String](非空)
@end

代码规范

命名规范

// ✅ 正确:方法命名遵循动词 + 名词模式
- (void)saveDataToDisk;
- (UIImage *)imageWithSize:(CGSize)size;
- (void)setBackgroundColor:(UIColor *)color;

// ✅ 正确:第一个参数描述方法意图
- (void)insertObject:(id)object atIndex:(NSUInteger)index;  // 不是 insert:atIndex:

// ✅ 正确:布尔属性使用 is/has/should/can 前缀
@property (nonatomic, assign, getter=isHidden) BOOL hidden;
@property (nonatomic, assign, getter=isEnabled) BOOL enabled;

初始化方法

// ✅ 正确:遵循初始化模式
- (instancetype)init {
    self = [super init];
    if (self) {
        [self commonInit];
    }
    return self;
}

- (instancetype)initWithName:(NSString *)name {
    self = [super init];
    if (self) {
        _name = [name copy];
        [self commonInit];
    }
    return self;
}

- (void)commonInit {
    // 公共初始化逻辑
}

单例模式

// ✅ 正确:线程安全的单例
+ (instancetype)sharedManager {
    static MyClass *sharedInstance = nil;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        sharedInstance = [[self alloc] init];
    });
    return sharedInstance;
}

常见陷阱

循环引用

// ❌ 错误:self -> block -> self 循环
self.handler = ^{
    [self doSomething];
};

// ✅ 正确:使用 weak 引用
__weak typeof(self) weakSelf = self;
self.handler = ^{
    [weakSelf doSomething];
};

KVO 陷阱

// ✅ 正确:KVO 配对注册和移除
- (void)startObserving {
    [self.object addObserver:self
                  forKeyPath:@"value"
                     options:NSKeyValueObservingOptionNew
                     context:&MyContextKey];
}

- (void)stopObserving {
    [self.object removeObserver:self
                     forKeyPath:@"value"
                        context:&MyContextKey];
}

- (void)observeValueForKeyPath:(NSString *)keyPath
                      ofObject:(id)object
                        change:(NSDictionary *)change
                       context:(void *)context {
    if (context == &MyContextKey) {
        // 处理 KVO
    } else {
        [super observeValueForKeyPath:keyPath ofObject:object change:change context:context];
    }
}

字符串比较

// ❌ 错误:使用 == 比较字符串内容
if (string == @"expected") { }

// ✅ 正确:使用 isEqualToString:
if ([string isEqualToString:@"expected"]) { }

// ✅ 正确:nil 安全检查
if (string != nil && [string isEqualToString:@"expected"]) { }

检查清单

在提交 Objective-C 代码前,请确认:

  • 使用 ARC,没有手动 retain/release
  • Block 使用 weak-strong dance 避免循环引用
  • delegate 使用 weak 引用
  • Category 命名有前缀,不会冲突
  • Protocol 方法实现前检查 respondsToSelector
  • Notification 在 dealloc 中移除
  • KVO 配对添加和移除
  • 单例使用 dispatch_once
  • 为 Swift 调用设计了友好的 API(如需要)

参考资源

平台分布

Codex

35.88%
按下载量换算33

Claude

27.95%
按下载量换算25

Cursor

17.63%
按下载量换算16

Gemini CLI

9.32%
按下载量换算8

安全审计

Gen Agent Trust Hub

通过

Socket

未通过

Snyk

通过

权限和风险

需要联网

该 Skill 可能需要联网访问来源站点、仓库或外部 API;具体网络访问范围需要结合源码和 README 复核。

安装前确认

本站仅展示第三方公开信息,不托管安装包,不提供自动安装或运行环境。安装前应自行审查源码、依赖和命令行为。来源安全扫描存在提醒或未通过项,安装前请自行复核。目前只有一个公开来源,建议同时核对源仓库。

继续浏览同类 Skills