标签: cocoa

解决Objective-C命名空间冲突的最佳方法是什么?

Objective-C没有名称空间; 它很像C,一切都在一个全局命名空间内.通常的做法是使用首字母为类添加前缀,例如,如果您在IBM工作,则可以在前面加上"IBM"; 如果你在微软工作,你可以使用"MS"; 等等.有时首字母引用项目,例如Adium前缀带有"AI"的类(因为没有公司可以使用缩写).Apple使用NS作为前缀类,并说这个前缀仅供Apple使用.

到目前为止一切顺利.但是在前面添加2到4个字母到一个类名是一个非常非常有限的命名空间.例如,MS或AI可能具有完全不同的含义(例如,AI可能是人工智能),而其他一些开发人员可能决定使用它们并创建一个同名的类.Bang,命名空间冲突.

好吧,如果这是你自己的一个类和你正在使用的外部框架之间的冲突,你可以轻松地改变你的类的命名,没什么大不了的.但是如果你使用两个外部框架,那么你没有源代码的框架和你无法改变的框架呢?您的应用程序与它们都链接,并且您会收到名称冲突.你会如何解决这些问题?以这样的方式解决它们的最佳方法是什么,你仍然可以使用这两个类?

在C中,您可以通过不直接链接到库来解决这些问题,而是使用dlopen()在运行时加载库,然后使用dlsym()找到您要查找的符号并将其分配给全局符号(即可以任何你喜欢的方式命名)然后通过这个全局符号访问它.例如,如果您遇到冲突,因为某个C库有一个名为open()的函数,您可以定义一个名为myOpen的变量并让它指向库的open()函数,因此当您想要使用系统open()时,你只需使用open(),当你想使用另一个时,你可以通过myOpen标识符访问它.

在Objective-C中是否有类似的可能性,如果没有,是否还有其他聪明,棘手的解决方案可以使用解析命名空间冲突?有任何想法吗?


更新:

只是为了澄清这一点:建议如何提前避免命名空间冲突或如何创建更好的命名空间的答案当然是受欢迎的; 但是,我不会接受它们作为答案,因为它们不能解决我的问题.我有两个库和它们的类名冲突.我无法改变它们; 我没有任何一个的来源.碰撞已经存在,如何提前避免它的提示将不再有用.我可以将它们转发给这些框架的开发人员,并希望他们在未来选择更好的命名空间,但目前我正在寻找一个解决方案,以便在单个应用程序中使用框架.任何可能的解决方案?

macos cocoa namespaces objective-c

174
推荐指数
4
解决办法
4万
查看次数

Objective-C Cocoa应用程序中的正则表达式

Initial Googling表明在Objective-C Cocoa应用程序中没有内置的方法来执行正则表达式.

所以有四个问题:

  1. 这是真的吗?

  2. 你在跟我开玩笑吗?

  3. 好的,那么你推荐一个不错的开源库吗?

  4. 在没有导入库的情况下,有什么方法可以使用NSScanner类?

regex cocoa objective-c

173
推荐指数
8
解决办法
8万
查看次数

为什么单元测试中的代码不能找到捆绑资源?

我单元测试的一些代码需要加载资源文件.它包含以下行:

NSString *path = [[NSBundle mainBundle] pathForResource:@"foo" ofType:@"txt"];
Run Code Online (Sandbox Code Playgroud)

在应用程序中它运行得很好,但是当单元测试框架运行时pathForResource:返回nil,意味着它找不到foo.txt.

我已经确定它foo.txt包含在单元测试目标的Copy Bundle Resources构建阶段中,为什么它找不到该文件呢?

xcode cocoa unit-testing nsbundle octest

173
推荐指数
4
解决办法
4万
查看次数

在NSUserDefaults中存储NSDate的最佳方法是什么?

我在NSUserDefaults中存储了两种存储NSDate的方法.

选项1 - setObject:forKey:

// Set
NSDate *myDate = [NSDate date];
[[NSUserDefaults standardUserDefaults] setObject:myDate forKey:@"myDateKey"];

// Get
NSDate *myDate = (NSDate *)[[NSUserDefaults standardUserDefaults] objectForKey:@"myDateKey"];
Run Code Online (Sandbox Code Playgroud)

选项2 - timeIntervalSince1970

// Set
NSDate *myDate = [NSDate date];
NSTimeInterval myDateTimeInterval = [myDate timeIntervalSince1970];
[[NSUserDefaults standardUserDefaults] setFloat:myDateTimeInterval forKey:@"myDateKey"];

// Get
NSTimeInterval myDateTimeInterval = [[NSUserDefaults standardUserDefaults] floatForKey:@"myDateKey"];
NSDate *myDate = [NSDate dateWithTimeIntervalSince1970:myDateTimeInterval];
Run Code Online (Sandbox Code Playgroud)

优点和缺点

选项1

这似乎是紧凑和合乎逻辑的.但是,由于Date Formatter错误,我担心这会出错.

选项2

这似乎很笨拙.我也不确定它的准确性 - 在我做过的一次测试中,当我检索到日期时它已经超过了48秒,尽管Apple Docs说NSTimeInterval具有"亚秒精度".

要求

无论我选择何种方法,都必须:

  1. 精确到一秒钟之内.

  2. 可读且可靠.

我的问题

选项2是不准确的,因为我做错了什么?

你会使用这两个选项中的哪一个?

还有其他选择我不知道吗?

谢谢!

cocoa datetime nsdate nsuserdefaults nstimeinterval

172
推荐指数
3
解决办法
5万
查看次数

如何在Swift中初始化NSData中的字符串

我一直在尝试从NSDataSwift中初始化一个字符串.

NSString Cocoa Documentation中, Apple说你必须使用它:

 init(data data: NSData!, encoding encoding: UInt)
Run Code Online (Sandbox Code Playgroud)

然而,Apple没有包含任何使用示例或放置的位置init.

我试图将以下代码从Objective-C转换为Swift

NSString *string;
string = [[NSString alloc] initWithData: data encoding: NSUTF8StringEncoding];
Run Code Online (Sandbox Code Playgroud)

我一直在尝试很多可能的语法,例如以下(当然它不起作用):

var string:NSString!
string = init(data: fooData,encoding: NSUTF8StringEncoding)
Run Code Online (Sandbox Code Playgroud)

string cocoa nsdata swift

171
推荐指数
3
解决办法
14万
查看次数

如何将CFStringRef转换为NSString?

NSString *aNSString;
CFStringRef aCFString;
aCFString = CFStringCreateWithCString(NULL, [aNSString UTF8String], NSUTF8StringEncoding);
aCFString = CFXMLCreateStringByUnescapingEntities(NULL, aCFString, NULL);
Run Code Online (Sandbox Code Playgroud)

我怎样才能得到一个新NSStringaCFString

string cocoa cfstring

165
推荐指数
3
解决办法
9万
查看次数

在cocoa objective-c类中变量前面的下划线如何工作?

我在一些iPhone示例中看到,属性在变量前面使用了下划线_.有谁知道这意味着什么?或者它是如何工作的?

我正在使用的接口文件如下所示:

@interface MissionCell : UITableViewCell {
    Mission *_mission;
    UILabel *_missionName;
}

@property (nonatomic, retain) UILabel *missionName;

- (Mission *)mission;
Run Code Online (Sandbox Code Playgroud)

我不确定上面做了什么,但是当我尝试设置任务名称时:

aMission.missionName = missionName;
Run Code Online (Sandbox Code Playgroud)

我收到错误:

请求成员'missionName'的东西不是结构或联合

variables syntax cocoa cocoa-touch objective-c

156
推荐指数
4
解决办法
5万
查看次数

Xcode构建失败"架构x86_64的未定义符号"

一个Xcode初学者的问题:

这是我第一次使用Xcode 4.6.3.

我正在尝试编写一个非常简单的控制台程序,搜索配对的BT设备并将它们打印到NSLog.

它构建时出现以下错误:

Undefined symbols for architecture x86_64:
  "_OBJC_CLASS_$_IOBluetoothDevice", referenced from:
      objc-class-ref in main.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
Run Code Online (Sandbox Code Playgroud)

我疯狂地搜索.常见问题应该是对文件的引用,其中只导入头文件,链接器不会找到实现(*.m-file).然而,IOBluetooth库是一个像Foundation Framework一样的标准框架.

我在上述陈述中缺少什么?

我也尝试过为32位机器构建它(再次构建失败).这显然是一个链接器错误,但我不知道它与它有什么关系,除了在x86和x64架构上找到IOBluetoothDevice的实现存在问题,而头文件来自标准包含的Framework,称为IOBluetooth?

为了您的信息,我的主要代码"main.m"是:

#import <Foundation/Foundation.h>
#import <IOBluetooth/objc/IOBluetoothDevice.h>          // Note the import for bluetooth
#import <IOBluetooth/objc/IOBluetoothDeviceInquiry.h>   // Note the import for bluetooth


int main(int argc, const char * argv[])
{
    @autoreleasepool {
        IOBluetoothDevice *currentDevice;
        NSArray *devices = [ IOBluetoothDevice pairedDevices];


        for (id …
Run Code Online (Sandbox Code Playgroud)

macos xcode cocoa objective-c iobluetooth

154
推荐指数
13
解决办法
34万
查看次数

Objective C - 从字符串中删除最后一个字符

在iPhone的Objective C中,如何使用按钮操作删除字符串的最后一个字符.

string cocoa cocoa-touch objective-c ios

151
推荐指数
4
解决办法
11万
查看次数

如何在Objective-C中进行字符串转换?

我想将一个字符串转换为一个双字符串,并在对其进行一些数学运算后,将其转换回字符串.

我如何在Objective-C中执行此操作?

有没有办法将double舍入到最接近的整数?

cocoa cocoa-touch objective-c

145
推荐指数
5
解决办法
28万
查看次数